Introduction

Goals of the project

In this project, we present a state-level overview of the expansion of health insurance in the United States and its effects on health outcomes and cost outcomes, from 2008 to 2015 under President Obama’s term. One of the hallmarks of Obama’s presidency was the passage and implementation of the Affordable Care Act (ACA) to increase health insurance coverage and regulate healthcare provision to protect consumers’ rights. In addition, we are also interested in how people perceive the (ACA), as seen from articles related to the ACA from the New York Times.

Research Questions:

  1. Trends of health insurance expansion in the United States: How has the percentage of uninsured Americans changed overall, and differentially by states, from 2008 to 2015? How has the composition of healthcare sources changed?

  2. Health outcomes: How do the states compare in health outcomes, such as mortality rates and access to preventative and remedying treatments?

  3. Financial outcomes: How do the states compare in financial and cost outcomes, such as the containment of out-of-pocket costs, insurance premium growth and government spending?

  4. Perceptions of the ACA: We used API to download articles realted to ACA on New York Times from 2011-2017 and transformed them into a corpus to conduct a text analysis. How has the overall trend of public attention changed over the years, as seen by the number of articles relating to the ACA? What topics do people focus on when they discuss the ACA?

Overview of the Affordable Care Act in the United States

The Patient Protection and Affordable Care Act (ACA), also commonly known as Obamacare, was a major and wide-sweeping healthcare reform initiative enacted by Preseident Obama. The ACA was signed into law by Obama on March 23, 2010, and changes were gradually implemented over the next few years, though the majority of the provisions went into effect only on January 1, 2014.

The major goal of the ACA is to expand health insurance and healthcare access to those who otherwise did not have access, including the 45 million Americans who were uninsured before the ACA took effect. In addition, it also covers wide-ranging regulations for the protection of healthcare consumer rights. Prior to the ACA, many low-income Americans we unable to afford any health insurance, while people with disabilities and pre-existing conditions may have been denied coverage by insurerers.

The key provisions of the ACA include

Employer mandate: Employers with more than 50 employees are required to provide health insurance to full-time workers, or would otherwise face a fine

Individual mandate: Individuals must obtain “minimum essential coverage” for healthcare, and those without health insurance must pay a fine in their annual tax returns to the IRS

State and federal marketplaces: These health insurance exchanges were set-up to enable people “shopping” for insurance to make easy comparisons among the insurance plans available, thus inreasing competition in the marketplace as well.

Medicaid expansion: The ACA expands medicaid to all individuals earning less than 138% of the federal poverty level (FPL), enabled first by federal funding and . After the Supreme Court ruled this requirement as unconstitutional (thus optional) in 2012, 31 states have elected to expand medicaid, while 19 have not.

Federal subsidies to people earning between 138% and 400% of the FPL to afford monthly health insurance premiums.

Regulations preventing insurance companies from discriminating in price and provision based on people’s age, gender, or pre-existing conditions

These provisions of the ACA make health insurance accessible and affordable to people previously without coverage. In addition, people who already have health insurance would also benefit from increased choice, a cap on out-of-pocket expenses, as well as more comprehensive coverage, as insurance is now required to cover more basic treatments than before.

However, this increased coverage comes at a cost of increased premium growths for consumers, and increases in federal spending. The expansion of health insurance and healthcare coverage is projected to cost of the U.S. government up to $1.34 trillion over the next decade. It is thus no surprise that the States fall on various sides of the political spectrum when it comes to support for medicaid.


(1) Health Insurance Coverage

Figure 1

Access our Shiny App on Uninsured Rates in the United States from 2008-2015.

Figure 2

The following figure displays the trend in the uninsured rate between 2008 and 2015. Results are shown for the USA average (in black), as well as for every individual state (in color).

We see a clear downward trend in the uninsured rate once most of the Affordable Care Act (ACA) provisions were implemented in 2014. The overall US uninsured rate decreased from 18.2% in 2010 to 10.5% in 2015.

However, note that the disparities in uninsured rates largely continue to persist among the states, with regional patterns (using Bureau of Economic Analysis (BEA) regions). States of the Southeast and Southwest consistently had the highest uninsured rates, while states of New England consistenely had the lowest insured or highest health insurance coverage rates.

Figure 3

In the following plot, I explore the difference between Democratic and Republican states, based on the 2012 US Presidential Election results. Generally, the democratic states consistently have had largely have a lower uninsured rate than the Republican states, though both groups experienced declines in the uninsured rates in 2014. The rate of decline of uninsured rates in 2014 for many Republican states appeared to exceed that of the Democratic states, mainly because of their higher starting point.

Figure 4

This plot shows insured rates in 2015 at a glance, looking at how they differ by party (2012 winner), BEA region and income level of the states.

In terms of correlations, it appears that being a Democratic state is a strong predictor of a higher insurance rate. States in New England, the Mideast and the Great Lakes perform well in insurance rates, while states in the Southwest, Rocky Mountains and Southeast perform the poorest. As expected, high-income states have the highest insurance rates as more people would be able to afford insurance. Lower and lower-middle income states have lower coverage rates, but it is infact the lower-middle income states that have the lowest insurance rates.

Figure 5

Next, we investigate the main health insurance and coverage sources, namely employer coverage, the individual marketplace, Medicaid / Childrens’ Health Insurance Program (CHIP), and Medicare for the aged. We broke down the results by party and income level, taking a simple (unweighted) average across the states in the categories. We observe that employer coverage rates increase as income level increases, especially for Democratic states. Democratic and low income states have more people on Medicaid / CHIP than Republican and low income states.

(2) Health Outcomes and Access

Figure 6

Next, we are interested to find out how health insurance rates correlates with health outcomes. In particular, we can look at the measure of mortality amenable to healthcare intervention - the number of deaths that could have been prevented by healthcare in the year 2014. We plot avoidable mortality (2014) against insurance rates (2014) and observe a negative relationship as expected. States that have higher rates of insurance also have better health in this respect. However, we also control for income levels as low income levels would be a major predictor of poor health, as confirmed in our plot. Yet, within each income level, the negative relationship remains, and it is especially pronounced among the upper-middle income countries.

Figure 7

The following maps how the states performed in various health outcomes, namely preventable mortality, access to a usual source of care, rate of age-appropriate cancer screenings in adults, and rate of age-appropriate vaccinations in adults. A green color incidates a comparatively more favorable outcome, while a red color indicates a less favorable outcome.

We note that the Northeast (New England) states perform consistently well across all health outcomes, while the Southeast states, as well as Texes, peform consistently poorly on all except for vaccination rates. The Western and Rocky Mountains states have a low avoidable mortality rate, despite having low rates of access to usual care and of cancer screening and vaccinations. In the measure of adult vaccination rates, the trend of the South faring poorer on health is reversed, as they do comparatively well in vaccinations.

(3) Affordability and Cost Outcomes

Figure 8

Similarly, we map how the states performed in various financial and cost outcomes, such as percentage of people with high OOP costs relative to household income, premium growth rates, affordability of the marketplace plans, and increases in federal spending related to the state.

We notice that states that do better in containing OOP costs tend to do worse in containing premium and marketplace plan rates as well as federal spending. These include some states like New York, New Jersey and Ohio in the Northeast and Midwest (Great Lakes). A notable exception is Massachussets, which performs well across the financial measures, possibly because of the headstart it got with “Romney-care”, which actually served as a model for Obamacare.

Summary of States’ Performance

The following data table presents the rankings of the states on the following insurance coverage, health and affordability outcomes, providing a summary of the states’ performance:

  1. Percentage of population insured

  2. Deaths preventable by healthcare intervention (per 100,000 people)

  3. Proportion of adults with access to a usual source of care

  4. Proportion of people with high out-of-pocket costs (relative to household income)

  5. Annual rate of health insurance premium growth from 2010 to 2015

A rank of 1 always indicates the more favorable outcome (i.e. higher insurance and treatment access rate, lower preventable mortality, OOP costs and premium growth)

Figure 9

(4) Perceptions of ACA (Text Analysis)

#Twitter API Sentiment/Text Analysis

Get some tweets from Twitter to analyze and visualize Set up Twitter API: Selecting data including Obamacare, ACA, Affordable Care Act, and #ACA (n=1000)

Who was tweeting most in the sample we collected

Let’s have a go at parsing some tweets, pulling out the names of folk who have been retweeted or who have had a tweet sent to them:

figure 10_

Extracting the source application. (We’re looking only at the iPhone and Android tweets- a much smaller number are from the web client or iPad). Overall, this includes 388 tweets from iPhone, and 256 tweets from Android. One consideration is what time of day the tweets occur, which we’d expect to be a “signature” of their user. Here we can certainly spot a difference:


Attaching package: 'purrr'

The following object is masked from 'package:qdap':

    %>%

The following objects are masked from 'package:dplyr':

    contains, order_by

The following object is masked from 'package:plyr':

    compact

The following object is masked from 'package:magrittr':

    set_names

The following object is masked from 'package:maps':

    map

Android  iPhone 
    237     249 

Attaching package: 'scales'

The following object is masked from 'package:purrr':

    discard

The following objects are masked from 'package:readr':

    col_factor, col_numeric

figure 11_ In the remaining by-word analyses in this text, we filter these quoted tweets out (since they contain text from followers that may not be representative of original tweets. Somewhere else we can see a difference involves sharing links or pictures in tweets.

figure 12_ Comparison of words Now that we’re sure there’s a difference, what can we say about the difference in the content? We’ll use the tidytext package. We start by dividing into individual words using the unnest_tokens function, and removing some common stopwords.

Sentiment analysis: Since we’ve observed a difference in sentiment between the Android and iPhone tweets, let’s try quantifying it. We’ll work with the NRC Word-Emotion Association lexicon, available from the tidytext package, which associates words with 10 sentiments: positive, negative, anger, anticipation, disgust, fear, joy, sadness, surprise, and trust.

To measure the sentiment of the Android and iPhone tweets, we can count the number of words in each category. (For example, we see that 41 of the 2331 words in the Android tweets were associated with “anger”). We then want to measure how much more likely the Android account is to use an emotionally-charged term relative to the iPhone account. Since this is count data, we can use a Poisson test to measure the difference:

figure 13_

Data Preparation using Twitter: The Twitter search API does not return an exhaustive list of tweets that match your search criteria, as Twitter only makes available a sample of recent tweets. For a more comprehensive search, we will need to use the Twitter streaming API, creating a database of results and regularly updating them, or use an online service that can do this. Now that we have tweet texts, we need to clean them up before doing any analysis. This involves removing content, such as punctuation, that has no emotional content, and removing any content that causes errors.

Text Cleaning

figure 14_ Frequent Words and Associations

figure 15_ Word Cloud

Figure 16

Topic Modelling

Text analysis: Media and the Affordable care act

We are also interested in how people think about Affordable care act(ACA). We want to have a look of the tweets and newspaper related to ACA. To realize this, we use API to download articles realted to ACA on New york times from 2011-2017 and transform them into corpus to do the text analysis.

Research Questions: 1) The overll trend of publuc attention, which can be shown as the number of articles related to ACA in different years. 2) What people discuss about when they discuss ACA, which can be shown as the word frequencies.

We could see that people discussed ACA a lot when obama first signed it, and the election in 2017 made it a hot topic again. And not suprisingly, peopel always talk about Trump when they talk about ACA

Figure 17

We could see that people discussed ACA a lot when Obama first signed it, and the election in 2017 made it a hot topic again. And not suprisingly, people always talk about Trump when they talk about ACA.

Figure 18

Figure 19

Wordcloud by Year

LS0tCnRpdGxlOiAiRGF0YSBWaXN1YWxpemF0aW9uIEZpbmFsIFByb2plY3Q6IFxuSGVhbHRoIEluc3VyYW5jZSBDb3ZlcmFnZSBpbiB0aGUgVW5pdGVkCiAgU3RhdGVzIgphdXRob3I6ICJHcmFjZSBLb25nLCBJcmlzIENoZW4gJiBGYW5nIExpdSAoR3JvdXAgUCkiCm91dHB1dDoKICBodG1sX2RvY3VtZW50OiBkZWZhdWx0CiAgaHRtbF9ub3RlYm9vazogZGVmYXVsdAotLS0KICAgICAKIyBJbnRyb2R1Y3Rpb24KCiMjIEdvYWxzIG9mIHRoZSBwcm9qZWN0CgpJbiB0aGlzIHByb2plY3QsIHdlIHByZXNlbnQgYSBfc3RhdGUtbGV2ZWwgb3ZlcnZpZXdfIG9mIHRoZSBleHBhbnNpb24gb2YgaGVhbHRoIGluc3VyYW5jZSBpbiB0aGUgVW5pdGVkIFN0YXRlcyBhbmQgaXRzIGVmZmVjdHMgb24gaGVhbHRoIG91dGNvbWVzIGFuZCBjb3N0IG91dGNvbWVzLCBmcm9tIDIwMDggdG8gMjAxNSB1bmRlciBQcmVzaWRlbnQgT2JhbWEncyB0ZXJtLiBPbmUgb2YgdGhlIGhhbGxtYXJrcyBvZiBPYmFtYSdzIHByZXNpZGVuY3kgd2FzIHRoZSBwYXNzYWdlIGFuZCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgX19BZmZvcmRhYmxlIENhcmUgQWN0IChBQ0EpX18gdG8gaW5jcmVhc2UgaGVhbHRoIGluc3VyYW5jZSBjb3ZlcmFnZSBhbmQgcmVndWxhdGUgaGVhbHRoY2FyZSBwcm92aXNpb24gdG8gcHJvdGVjdCBjb25zdW1lcnMnIHJpZ2h0cy4gSW4gYWRkaXRpb24sIHdlIGFyZSBhbHNvIGludGVyZXN0ZWQgaW4gaG93IHBlb3BsZSBwZXJjZWl2ZSB0aGUgKEFDQSksIGFzIHNlZW4gZnJvbSBhcnRpY2xlcyByZWxhdGVkIHRvIHRoZSBBQ0EgZnJvbSB0aGUgTmV3IFlvcmsgVGltZXMuCgpfX1Jlc2VhcmNoIFF1ZXN0aW9uczpfXwoKMSkgX1RyZW5kcyBvZiBoZWFsdGggaW5zdXJhbmNlIGV4cGFuc2lvbiBpbiB0aGUgVW5pdGVkIFN0YXRlc186IEhvdyBoYXMgdGhlIHBlcmNlbnRhZ2Ugb2YgdW5pbnN1cmVkIEFtZXJpY2FucyBjaGFuZ2VkIG92ZXJhbGwsIGFuZCBkaWZmZXJlbnRpYWxseSBieSBzdGF0ZXMsIGZyb20gMjAwOCB0byAyMDE1PyBIb3cgaGFzIHRoZSBjb21wb3NpdGlvbiBvZiBoZWFsdGhjYXJlIHNvdXJjZXMgY2hhbmdlZD8KCjIpIF9IZWFsdGggb3V0Y29tZXNfOiBIb3cgZG8gdGhlIHN0YXRlcyBjb21wYXJlIGluIGhlYWx0aCBvdXRjb21lcywgc3VjaCBhcyBtb3J0YWxpdHkgcmF0ZXMgYW5kIGFjY2VzcyB0byBwcmV2ZW50YXRpdmUgYW5kIHJlbWVkeWluZyB0cmVhdG1lbnRzPwoKMykgX0ZpbmFuY2lhbCBvdXRjb21lc186IEhvdyBkbyB0aGUgc3RhdGVzIGNvbXBhcmUgaW4gZmluYW5jaWFsIGFuZCBjb3N0IG91dGNvbWVzLCBzdWNoIGFzIHRoZSBjb250YWlubWVudCBvZiBvdXQtb2YtcG9ja2V0IGNvc3RzLCBpbnN1cmFuY2UgcHJlbWl1bSBncm93dGggYW5kIGdvdmVybm1lbnQgc3BlbmRpbmc/Cgo0KSBfUGVyY2VwdGlvbnMgb2YgdGhlIEFDQV86IFdlIHVzZWQgQVBJIHRvIGRvd25sb2FkIGFydGljbGVzIHJlYWx0ZWQgdG8gQUNBIG9uIE5ldyBZb3JrIFRpbWVzIGZyb20gMjAxMS0yMDE3IGFuZCB0cmFuc2Zvcm1lZCB0aGVtIGludG8gYSBjb3JwdXMgdG8gY29uZHVjdCBhIHRleHQgYW5hbHlzaXMuIEhvdyBoYXMgdGhlIG92ZXJhbGwgdHJlbmQgb2YgcHVibGljIGF0dGVudGlvbiBjaGFuZ2VkIG92ZXIgdGhlIHllYXJzLCBhcyBzZWVuIGJ5IHRoZSBudW1iZXIgb2YgYXJ0aWNsZXMgcmVsYXRpbmcgdG8gdGhlIEFDQT8gV2hhdCB0b3BpY3MgZG8gcGVvcGxlIGZvY3VzIG9uIHdoZW4gdGhleSBkaXNjdXNzIHRoZSBBQ0E/CgojIyBPdmVydmlldyBvZiB0aGUgQWZmb3JkYWJsZSBDYXJlIEFjdCBpbiB0aGUgVW5pdGVkIFN0YXRlcwoKVGhlIF9fUGF0aWVudCBQcm90ZWN0aW9uIGFuZCBBZmZvcmRhYmxlIENhcmUgQWN0IChBQ0EpX18sIGFsc28gY29tbW9ubHkga25vd24gYXMgT2JhbWFjYXJlLCB3YXMgYSBtYWpvciBhbmQgd2lkZS1zd2VlcGluZyBoZWFsdGhjYXJlIHJlZm9ybSBpbml0aWF0aXZlIGVuYWN0ZWQgYnkgUHJlc2VpZGVudCBPYmFtYS4gVGhlIEFDQSB3YXMgc2lnbmVkIGludG8gbGF3IGJ5IE9iYW1hIG9uIE1hcmNoIDIzLCAyMDEwLCBhbmQgY2hhbmdlcyB3ZXJlIGdyYWR1YWxseSBpbXBsZW1lbnRlZCBvdmVyIHRoZSBuZXh0IGZldyB5ZWFycywgdGhvdWdoIHRoZSBtYWpvcml0eSBvZiB0aGUgcHJvdmlzaW9ucyB3ZW50IGludG8gZWZmZWN0IG9ubHkgb24gSmFudWFyeSAxLCAyMDE0LiAgIAoKVGhlIG1ham9yIGdvYWwgb2YgdGhlIEFDQSBpcyB0byBleHBhbmQgaGVhbHRoIGluc3VyYW5jZSBhbmQgaGVhbHRoY2FyZSBhY2Nlc3MgdG8gdGhvc2Ugd2hvIG90aGVyd2lzZSBkaWQgbm90IGhhdmUgYWNjZXNzLCBpbmNsdWRpbmcgdGhlIDQ1IG1pbGxpb24gQW1lcmljYW5zIHdobyB3ZXJlIHVuaW5zdXJlZCBiZWZvcmUgdGhlIEFDQSB0b29rIGVmZmVjdC4gSW4gYWRkaXRpb24sIGl0IGFsc28gY292ZXJzIHdpZGUtcmFuZ2luZyByZWd1bGF0aW9ucyBmb3IgdGhlIHByb3RlY3Rpb24gb2YgaGVhbHRoY2FyZSBjb25zdW1lciByaWdodHMuIFByaW9yIHRvIHRoZSBBQ0EsIG1hbnkgbG93LWluY29tZSBBbWVyaWNhbnMgd2UgdW5hYmxlIHRvIGFmZm9yZCBhbnkgaGVhbHRoIGluc3VyYW5jZSwgd2hpbGUgcGVvcGxlIHdpdGggZGlzYWJpbGl0aWVzIGFuZCBwcmUtZXhpc3RpbmcgY29uZGl0aW9ucyBtYXkgaGF2ZSBiZWVuIGRlbmllZCBjb3ZlcmFnZSBieSBpbnN1cmVyZXJzLiAgIAoKX19UaGUga2V5IHByb3Zpc2lvbnMgb2YgdGhlIEFDQSBpbmNsdWRlX18gIAoKX0VtcGxveWVyIG1hbmRhdGVfOiBFbXBsb3llcnMgd2l0aCBtb3JlIHRoYW4gNTAgZW1wbG95ZWVzIGFyZSByZXF1aXJlZCB0byBwcm92aWRlIGhlYWx0aCBpbnN1cmFuY2UgdG8gZnVsbC10aW1lIHdvcmtlcnMsIG9yIHdvdWxkIG90aGVyd2lzZSBmYWNlIGEgZmluZQoKX0luZGl2aWR1YWwgbWFuZGF0ZV86IEluZGl2aWR1YWxzIG11c3Qgb2J0YWluICJtaW5pbXVtIGVzc2VudGlhbCBjb3ZlcmFnZSIgZm9yIGhlYWx0aGNhcmUsIGFuZCB0aG9zZSB3aXRob3V0IGhlYWx0aCBpbnN1cmFuY2UgbXVzdCBwYXkgYSBmaW5lIGluIHRoZWlyIGFubnVhbCB0YXggcmV0dXJucyB0byB0aGUgSVJTCgpfU3RhdGUgYW5kIGZlZGVyYWwgbWFya2V0cGxhY2VzXzogVGhlc2UgaGVhbHRoIGluc3VyYW5jZSBleGNoYW5nZXMgd2VyZSBzZXQtdXAgdG8gZW5hYmxlIHBlb3BsZSAic2hvcHBpbmciIGZvciBpbnN1cmFuY2UgdG8gbWFrZSBlYXN5IGNvbXBhcmlzb25zIGFtb25nIHRoZSBpbnN1cmFuY2UgcGxhbnMgYXZhaWxhYmxlLCB0aHVzIGlucmVhc2luZyBjb21wZXRpdGlvbiBpbiB0aGUgbWFya2V0cGxhY2UgYXMgd2VsbC4KCl9NZWRpY2FpZCBleHBhbnNpb25fOiBUaGUgQUNBIGV4cGFuZHMgbWVkaWNhaWQgdG8gYWxsIGluZGl2aWR1YWxzIGVhcm5pbmcgbGVzcyB0aGFuIDEzOCUgb2YgdGhlIGZlZGVyYWwgcG92ZXJ0eSBsZXZlbCAoRlBMKSwgZW5hYmxlZCBmaXJzdCBieSBmZWRlcmFsIGZ1bmRpbmcgYW5kIC4gQWZ0ZXIgdGhlIFN1cHJlbWUgQ291cnQgcnVsZWQgdGhpcyByZXF1aXJlbWVudCBhcyB1bmNvbnN0aXR1dGlvbmFsICh0aHVzIG9wdGlvbmFsKSBpbiAyMDEyLCAzMSBzdGF0ZXMgaGF2ZSBlbGVjdGVkIHRvIGV4cGFuZCBtZWRpY2FpZCwgd2hpbGUgMTkgaGF2ZSBub3QuCgpfRmVkZXJhbCBzdWJzaWRpZXNfIHRvIHBlb3BsZSBlYXJuaW5nIGJldHdlZW4gMTM4JSBhbmQgNDAwJSBvZiB0aGUgRlBMIHRvIGFmZm9yZCBtb250aGx5IGhlYWx0aCBpbnN1cmFuY2UgcHJlbWl1bXMuCgpfUmVndWxhdGlvbnNfIHByZXZlbnRpbmcgaW5zdXJhbmNlIGNvbXBhbmllcyBmcm9tIGRpc2NyaW1pbmF0aW5nIGluIHByaWNlIGFuZCBwcm92aXNpb24gYmFzZWQgb24gcGVvcGxlJ3MgYWdlLCBnZW5kZXIsIG9yIHByZS1leGlzdGluZyBjb25kaXRpb25zCgpUaGVzZSBwcm92aXNpb25zIG9mIHRoZSBBQ0EgbWFrZSBoZWFsdGggaW5zdXJhbmNlIGFjY2Vzc2libGUgYW5kIGFmZm9yZGFibGUgdG8gcGVvcGxlIHByZXZpb3VzbHkgd2l0aG91dCBjb3ZlcmFnZS4gSW4gYWRkaXRpb24sIHBlb3BsZSB3aG8gYWxyZWFkeSBoYXZlIGhlYWx0aCBpbnN1cmFuY2Ugd291bGQgYWxzbyBiZW5lZml0IGZyb20gaW5jcmVhc2VkIGNob2ljZSwgYSBjYXAgb24gb3V0LW9mLXBvY2tldCBleHBlbnNlcywgYXMgd2VsbCBhcyBtb3JlIGNvbXByZWhlbnNpdmUgY292ZXJhZ2UsIGFzIGluc3VyYW5jZSBpcyBub3cgcmVxdWlyZWQgdG8gY292ZXIgbW9yZSBiYXNpYyB0cmVhdG1lbnRzIHRoYW4gYmVmb3JlLgoKSG93ZXZlciwgdGhpcyBpbmNyZWFzZWQgY292ZXJhZ2UgY29tZXMgYXQgYSBjb3N0IG9mIGluY3JlYXNlZCBwcmVtaXVtIGdyb3d0aHMgZm9yIGNvbnN1bWVycywgYW5kIGluY3JlYXNlcyBpbiBmZWRlcmFsIHNwZW5kaW5nLiBUaGUgZXhwYW5zaW9uIG9mIGhlYWx0aCBpbnN1cmFuY2UgYW5kIGhlYWx0aGNhcmUgY292ZXJhZ2UgaXMgcHJvamVjdGVkIHRvIGNvc3Qgb2YgdGhlIFUuUy4gZ292ZXJubWVudCB1cCB0byAkMS4zNCB0cmlsbGlvbiBvdmVyIHRoZSBuZXh0IGRlY2FkZS4gSXQgaXMgdGh1cyBubyBzdXJwcmlzZSB0aGF0IHRoZSBTdGF0ZXMgZmFsbCBvbiB2YXJpb3VzIHNpZGVzIG9mIHRoZSBwb2xpdGljYWwgc3BlY3RydW0gd2hlbiBpdCBjb21lcyB0byBzdXBwb3J0IGZvciBtZWRpY2FpZC4KCgotLS0tLQoKYGBge3IsIHdhcm5pbmc9RkFMU0UsIGluY2x1ZGU9RkFMU0UsIHRpZHk9VFJVRX0Kcm0obGlzdD1scygpKQoKbGlicmFyeShsZWFmbGV0KQpsaWJyYXJ5KG1hcHMpCmxpYnJhcnkocmdkYWwpCmxpYnJhcnkoRFQpCmxpYnJhcnkoZ2dwbG90MikKbGlicmFyeShnZ3RoZW1lcykKbGlicmFyeShwbG90bHkpCmxpYnJhcnkobWFncml0dHIpCmxpYnJhcnkocmVhZHhsKQpsaWJyYXJ5KHBseXIpCmxpYnJhcnkoZHBseXIpCmxpYnJhcnkodGlkeXIpCmxpYnJhcnkocmVhZHIpCmxpYnJhcnkoc3RyaW5naSkKbGlicmFyeShSQ29sb3JCcmV3ZXIpCmxpYnJhcnkoY291bnRyeWNvZGUpCnJlcXVpcmUoZ3JpZEV4dHJhKQpgYGAKCgpgYGB7ciwgZXZhbCA9IFRSVUUsIGVjaG8gPSBGQUxTRSwgd2FybmluZyA9IEZBTFNFLCB0aWR5ID0gVFJVRX0KIyMgSU1QT1JUIERBVEEKCiMgR2VuZXJhbCBBQ0EgaW5mb3JtYXRpb24KYWNhX2dlbmVyYWxfcmF3IDwtIHJlYWRfZXhjZWwoIkRhdGEvc3RhdGVzX2FjYV9nZW5lcmFsLnhsc3giLCBzaGVldD0yLCBjb2xfbmFtZXM9RkFMU0UpCgojIFN0YXRlcyBoZWFsdGggb3V0Y29tZXMKaGVhbHRoX2luZF9yYXcgPC0gcmVhZF9leGNlbCgiRGF0YS9zdGF0ZXNfaGVhbHRoX2luZC54bHN4Iiwgc2hlZXQ9NCwgY29sX25hbWVzPUZBTFNFKQoKIyBJbnN1cmFuY2UgY292ZXJhZ2UgZGF0YQogICMgTG9uZyBmb3JtYXQKaW5zdXJhbmNlX2xvbmcgPC0gcmVhZF9leGNlbCgiRGF0YS9pbnN1cmFuY2UtY2xlYW4ueGxzeCIsIHNoZWV0PTEsIGNvbF9uYW1lcz1UUlVFKQogICMgV2lkZSBmb3JtYXQKaW5zdXJhbmNlIDwtIHJlYWRfZXhjZWwoIkRhdGEvaW5zdXJhbmNlLWNsZWFuLnhsc3giLCBzaGVldD0yLCBjb2xfbmFtZXM9VFJVRSkKCiMgRGVtb2dyYXBoaWMgaW5mb3JtYXRpb24KZGVtb2dyYXBoaWNzMSA8LSByZWFkLmNzdigiRGF0YS9Qb3B1bGF0aW9uX0FnZV9JbmNvbWUuY3N2IiwgaGVhZGVyID0gVFJVRSkKICAjIFByb3ZpZGVkIHdpdGggQXNzaWdubWVudCA0ICh3YW50IHRoZSB5ZWFybHkgcG9wdWxhdGlvbiBkYXRhKQpkZW1vZ3JhcGhpY3MyIDwtIHJlYWRfZXhjZWwoIkRhdGEvUG9wdWxhdGlvbkVzdGltYXRlcy54bHMiKQoKIyBFbGVjdGlvbiBSZXN1bHRzCmVsZWN0aW9uIDwtIHJlYWRfZXhjZWwoIkRhdGEvVVNfUHJlc2lkZW50aWFsX1Jlc3VsdHNfYnlfU3RhdGVfMTgyOC0yMDE2Lnhsc3giLCBzaGVldD0yLCBjb2xfbmFtZXM9RkFMU0UpCmBgYAoKYGBge3IsIGV2YWwgPSBUUlVFLCBlY2hvID0gRkFMU0UsIHdhcm5pbmcgPSBGQUxTRSwgdGlkeSA9IFRSVUV9CiMjIENMRUFOIERBVEEKCiMgTGlzdCBvZiBzdGF0ZXMgYWJicmV2aWF0aW9ucwpzdGF0ZV9hYmJyZXZpYXRpb25zIDwtIGMoIkFMIiwgIkFLIiwgIkFaIiwgIkFSIiwgIkNBIiwgIkNPIiwgIkNUIiwgIkRFIiwgIkZMIiwgIkdBIiwgIkhJIiwgIklEIiwgIklMIiwgIklOIiwgIklBIiwgIktTIiwgIktZIiwgIkxBIiwgIk1FIiwgIk1EIiwgIk1BIiwgIk1JIiwgIk1OIiwgIk1TIiwgIk1PIiwgIk1UIiwgIk5FIiwgIk5WIiwgIk5IIiwgIk5KIiwgIk5NIiwgIk5ZIiwgIk5DIiwgIk5EIiwgIk9IIiwgIk9LIiwgIk9SIiwgIlBBIiwgIlJJIiwgIlNDIiwgIlNEIiwgIlROIiwgIlRYIiwgIlVUIiwgIlZUIiwgIlZBIiwgIldBIiwgIldWIiwgIldJIiwgIldZIikKCgojIyBDTEVBTiBJTlNVUkFOQ0UgUkFURVMgREFUQSAoV0lERSkKCiMgRHJvcCB1bm5lY2Vzc2FyeSBjb2x1bW5zCmluc3VyYW5jZSA8LSBpbnN1cmFuY2VbMTo1MCwgLTFdCgojIFJlbmFtZSB2YXJpYWJsZXMKY29sbmFtZXMoaW5zdXJhbmNlKSA8LSBjKCJzdGF0ZV9hYmIiLCAic3RhdGUiLCAidW5pbnN1cmVkX251bV8yMDA4IiwgInVuaW5zdXJlZF9wY3RfMjAwOCIsICJ1bmluc3VyZWRfbnVtXzIwMDkiLCAidW5pbnN1cmVkX3BjdF8yMDA5IiwgInVuaW5zdXJlZF9udW1fMjAxMCIsICJ1bmluc3VyZWRfcGN0XzIwMTAiLCAidW5pbnN1cmVkX251bV8yMDExIiwgInVuaW5zdXJlZF9wY3RfMjAxMSIsICJ1bmluc3VyZWRfbnVtXzIwMTIiLCAidW5pbnN1cmVkX3BjdF8yMDEyIiwgInVuaW5zdXJlZF9udW1fMjAxMyIsICJ1bmluc3VyZWRfcGN0XzIwMTMiLCAidW5pbnN1cmVkX251bV8yMDE0IiwgInVuaW5zdXJlZF9wY3RfMjAxNCIsICJ1bmluc3VyZWRfbnVtXzIwMTUiLCAidW5pbnN1cmVkX3BjdF8yMDE1IikKCiMgQ3JlYXRlIHZhcmlhYmxlcyBmb3IgaW5zdXJhbmNlIHJhdGVzCmluc3VyYW5jZSRpbnN1cmVkX3BjdF8yMDA4IDwtIDEwMCAtIGluc3VyYW5jZSR1bmluc3VyZWRfcGN0XzIwMDgKaW5zdXJhbmNlJGluc3VyZWRfcGN0XzIwMDkgPC0gMTAwIC0gaW5zdXJhbmNlJHVuaW5zdXJlZF9wY3RfMjAwOQppbnN1cmFuY2UkaW5zdXJlZF9wY3RfMjAxMCA8LSAxMDAgLSBpbnN1cmFuY2UkdW5pbnN1cmVkX3BjdF8yMDEwCmluc3VyYW5jZSRpbnN1cmVkX3BjdF8yMDExIDwtIDEwMCAtIGluc3VyYW5jZSR1bmluc3VyZWRfcGN0XzIwMTEKaW5zdXJhbmNlJGluc3VyZWRfcGN0XzIwMTIgPC0gMTAwIC0gaW5zdXJhbmNlJHVuaW5zdXJlZF9wY3RfMjAxMgppbnN1cmFuY2UkaW5zdXJlZF9wY3RfMjAxMyA8LSAxMDAgLSBpbnN1cmFuY2UkdW5pbnN1cmVkX3BjdF8yMDEzCmluc3VyYW5jZSRpbnN1cmVkX3BjdF8yMDE0IDwtIDEwMCAtIGluc3VyYW5jZSR1bmluc3VyZWRfcGN0XzIwMTQKaW5zdXJhbmNlJGluc3VyZWRfcGN0XzIwMTUgPC0gMTAwIC0gaW5zdXJhbmNlJHVuaW5zdXJlZF9wY3RfMjAxNQoKIyBSZW9yZGVyIHZhcmlhYmxlcwppbnN1cmFuY2UgPC0gaW5zdXJhbmNlWyAsIGMoInN0YXRlX2FiYiIsICJzdGF0ZSIsICJ1bmluc3VyZWRfbnVtXzIwMDgiLCAidW5pbnN1cmVkX3BjdF8yMDA4IiwgImluc3VyZWRfcGN0XzIwMDgiLCAidW5pbnN1cmVkX251bV8yMDA5IiwgInVuaW5zdXJlZF9wY3RfMjAwOSIsICJpbnN1cmVkX3BjdF8yMDA5IiwgInVuaW5zdXJlZF9udW1fMjAxMCIsICJ1bmluc3VyZWRfcGN0XzIwMTAiLCAiaW5zdXJlZF9wY3RfMjAxMCIsICJ1bmluc3VyZWRfbnVtXzIwMTEiLCAidW5pbnN1cmVkX3BjdF8yMDExIiwgImluc3VyZWRfcGN0XzIwMTEiLCAidW5pbnN1cmVkX251bV8yMDEyIiwgInVuaW5zdXJlZF9wY3RfMjAxMiIsICJpbnN1cmVkX3BjdF8yMDEyIiwgInVuaW5zdXJlZF9udW1fMjAxMyIsICJ1bmluc3VyZWRfcGN0XzIwMTMiLCAiaW5zdXJlZF9wY3RfMjAxMyIsICJ1bmluc3VyZWRfbnVtXzIwMTQiLCAidW5pbnN1cmVkX3BjdF8yMDE0IiwgImluc3VyZWRfcGN0XzIwMTQiLCAidW5pbnN1cmVkX251bV8yMDE1IiwgInVuaW5zdXJlZF9wY3RfMjAxNSIsICJpbnN1cmVkX3BjdF8yMDE1IildCgoKIyMgQ0xFQU4gSU5TVVJBTkNFIFJBVEVTIERBVEEgKExPTkcpCgojIFJlbmFtZSB2YXJpYWJsZXMKY29sbmFtZXMoaW5zdXJhbmNlX2xvbmcpIDwtIGMoInllYXIiLCAic3RhdGUiLCAicG9wdWxhdGlvbiIsICJ1bmluc3VyZWRfbnVtIiwgInVuaW5zdXJlZF9wY3QiLCAiaW5zdXJlZF9udW0iLCAiaW5zdXJlZF9wY3QiKQoKIyBBZGQgc3RhdGUgYWJicmV2aWF0aW9ucwogICMgRmlyc3QgY3JlYXRlIGEgbG9vay11cCB0YWJsZSAoYmFzZWQgb24gd2lkZSBkYXRhKQpzdGF0ZV9hYmJfbG9va3VwIDwtIGluc3VyYW5jZVsgLCBjKCJzdGF0ZSIsICJzdGF0ZV9hYmIiKV0KICAjIFRoZW4gZG8gdGhlIG1hdGNoaW5nCmluc3VyYW5jZV9sb25nJHN0YXRlX2FiYiA8LSBzdGF0ZV9hYmJfbG9va3VwJHN0YXRlX2FiYlttYXRjaChpbnN1cmFuY2VfbG9uZyRzdGF0ZSwgc3RhdGVfYWJiX2xvb2t1cCRzdGF0ZSldCiAgIyBSZW9yZGVyIHZhcmlhYmxlCmluc3VyYW5jZV9sb25nIDwtIGluc3VyYW5jZV9sb25nWyAsIGMoMToyLCBuY29sKGluc3VyYW5jZV9sb25nKSwgMzoobmNvbChpbnN1cmFuY2VfbG9uZyktMSkpXQoKIyBPcmRlciBvYnNlcnZhdGlvbnMgKGJ5IHN0YXRlLCB0aGVuIGJ5IHllYXIpCmluc3VyYW5jZV9sb25nIDwtIGluc3VyYW5jZV9sb25nW29yZGVyKGluc3VyYW5jZV9sb25nJHN0YXRlLCBpbnN1cmFuY2VfbG9uZyR5ZWFyKSwgXQoKCiMjIENMRUFOIEFDQSBHRU5FUkFMIERBVEEKCiMgS2VlcCBvbmx5IHJlbGV2YW50IHJvd3MgYW5kIGNvbHVtbnMKYWNhX2dlbmVyYWwgPC0gYWNhX2dlbmVyYWxfcmF3WzY6NTcsIDE6NzNdCgojIExhYmVsIHZhcmlhYmxlcyBmb3IgQUNBIGdlbmVyYWwgZGF0YQpuYW1lcyhhY2FfZ2VuZXJhbCkgPC0gYygic3RhdGUiLCAidW5pbnNfYWxsX3BjdF8xMCIsICJ1bmluc19hbGxfcGN0XzE1IiwgInVuaW5zX2FsbF9kZWNyX3BjdCIsICJ1bmluc19hbGxfZGVjciIsICJjb3ZfZW1wIiwgImNvdl9wYXJlbnRzX3BsYW4iLCAibGlmZXRpbWVfbGltX3ByZUFDQV90b3QiLCAibGlmZXRpbWVfbGltX3ByZUFDQV9jaGlsZCIsICJsaWZldGltZV9saW1fcHJlQUNBX2FkdWx0TSIsICJsaWZldGltZV9saW1fcHJlQUNBX2FkdWx0RiIsICJjb3ZfcHJpdmF0ZV90b3QiLCAiY292X3ByaXZhdGVfY2hpbGQiLCAiY292X3ByaXZhdGVfYWR1bHRNIiwgImNvdl9wcml2YXRlX2FkdWx0RiIsICJwcmVtaXVtX2VtcF9hdmdfZ3Jvd3RoX3BjdF8wMHRvMTAiLCAicHJlbWl1bV9lbXBfYXZnX2dyb3d0aF9wY3RfMTB0bzE1IiwgInByZW1pdW1fZW1wX3NhdmluZ3NfMTUiLCAicHJlbWl1bV9lbXBfc2F2aW5nc18xNiIsICJNTFJfcmViYXRlX2JlbmVmaWNpYXJpZXNfMTIiLCAiTUxSX3JlYmF0ZV9hbXRfMTIiLCAiTUxSX3JlYmF0ZV9iZW5lZmljaWFyaWVzXzEzIiwgIk1MUl9yZWJhdGVfYW10XzEzIiwgIk1MUl9yZWJhdGVfYmVuZWZpY2lhcmllc18xNCIsICJNTFJfcmViYXRlX2FtdF8xNCIsICJNTFJfcmViYXRlX2JlbmVmaWNpYXJpZXNfMTUiLCAiTUxSX3JlYmF0ZV9hbXRfMTUiLCAiTUxSX3JlYmF0ZV9hbXRfMTJ0bzE1IiwgIm1lZGljYWlkX2Vucm9sbF8xMyIsICJtZWRpY2FpZF9lbnJvbGxfMTYiLCAibWVkaWNhaWRfZW5yb2xsX2NoaWxkXzEzIiwgIm1lZGljYWlkX2Vucm9sbF9pbmNyXzEzdG8xNiIsICJtZWRpY2FpZF9mdWxsX2R1YWxzIiwgIm1lZGljYWlkX3BhcnRpYWxfZHVhbHMiLCAibWVkaWNhaWRfZnVsbF9vcl9wYXJ0aWFsX2R1YWxzIiwgInN0YXRlX2hhc19leHBhbmRlZCIsICJpbnN1cmFuY2VfaW5jcl9tZWRpY2FpZCIsICJjaG9sZXN0X3Njcl9pbmNyX21lZGljYWlkIiwgIm1hbW1vZ3JhbV9pbmNyX21lZGljYWlkIiwgInBhcHNtZWFyX2luY3JfbWVkaWNhaWQiLCAiY2xpbmljX2NhcmVfaW5jcl9tZWRpY2FpZCIsICJhbGxfY2FyZV9pbmNyX21lZGljYWlkIiwgInBoeWNpc2lhbl92aXNpdF9hbm5faW5jcl9tZWRpY2FpZCIsICJkZXByZXNzaW9uX2RlY3JfbWVkaWNhaWQiLCAiZ29vZF9oZWFsdGhfaW5jcl9tZWRpY2FpZCIsICJkZWF0aHNfYW5uX2RlY3JfbWVkaWNhaWQiLCAiY2F0YXN0cm9waGljX29vcF9hbm5fZGVjcl9tZWRpY2FpZCIsICJpbmRlYnRlZF9wcGxfZGVjcl9tZWRpY2FpZCIsICJmZWRfc3BlbmRpbmdfbmV0X2luY3JfaW5NaWwiLCAidW5jb21wZW5zYXRlZF9jYXJlX2RlY3JfaW5NaWwiLCAibWVudGFsX3N1YnN0YW5jZV9lbGlnX21lZGljYWlkX3NoYXJlIiwgIm1lbnRhbF9zdWJzdGFuY2VfZWxpZ19tZWRpY2FpZCIsICJwcmVleGlzdGluZ19jb25kaXRpb25fMDkiLCAiY292X21rdF9wbGFuXzE2IiwgImNvdl9ta3RfMTYiLCAicmVjZWl2ZV90YXhfY3JlZGl0IiwgImF2Z190YXhfY3JlZGl0IiwgInJlY2VpdmVfY29zdF9zaGFyaW5nIiwgImF2Z19udW1fbWt0X3BsYW5zX2F2YWlsXzE3IiwgImNvdl9ta3RfdW5kZXI3NURfcGN0IiwgImNvdl9ta3RfdW5kZXIxMDBEX3BjdCIsICJjb3Zfb2ZmbWt0X2VsaWdfdGF4X2NyZWRpdCIsICJyYXRlX3Jldmlld19mdW5kc190b19zdGF0ZSIsICJISUVDUF9ncmFudF9hd2FyZF90b19zdGF0ZSIsICJtZWRpY2FyZV9lbnJvbGxfMTYiLCAibWVkaWNhcmVfYmVuZWZfZG9udXRob2xlIiwgIm1lZGljYXJlX2JlbmVmX2RvbnV0aG9sZV9zYXZpbmdzX3RvdCIsICJtZWRpY2FyZV9iZW5lZl9kb251dGhvbGVfc2F2aW5nc19hdmciLCAibWVkaWNhcmVfcGFydEJfZnJlZV9wcmV2X3NlcnZpY2VzIiwgIm1lZGljYXJlX3BhcnRCX2ZyZWVfcHJldl9zZXJ2aWNlc19zaGFyZSIsICJtZWRpY2FyZV9pbmNyX3JlYWRtaXRfcmF0ZSIsICJtZWRpY2FyZV9hdm9pZGVkX3JlYWRtaXQiLCAiYWNjb3VudGFibGVfY2FyZV9vcmdfbnVtIikKCiMgVHJpbSB3aGl0ZSBzcGFjZSBvbiBzdGF0ZSB2YXJpYWJsZQphY2FfZ2VuZXJhbCRzdGF0ZSA8LSBzdHJpX3RyaW1fYm90aChhY2FfZ2VuZXJhbCRzdGF0ZSkKCiMgQ2hhbmdlIGZvcm1hdCBvZiB2YXJpYWJsZXMKICAjIEFwYXJ0IGZyb20gVC9GIHZhcmlhYmxlIGZvciAic3RhdGUgaGFzIGV4cGFuZGVkIgphY2FfZ2VuZXJhbCRzdGF0ZV9oYXNfZXhwYW5kZWRbYWNhX2dlbmVyYWwkc3RhdGVfaGFzX2V4cGFuZGVkPT0ieWVzIl0gPC0gVFJVRSAKYWNhX2dlbmVyYWwkc3RhdGVfaGFzX2V4cGFuZGVkW2FjYV9nZW5lcmFsJHN0YXRlX2hhc19leHBhbmRlZD09Im5vIl0gPC0gRkFMU0UgCiAgIyBDb252ZXJ0IG90aGVycyB0byBudW1lcmljIGZvcm0KZm9yIChqIGluIGMoMjozNSwgMzc6NzMpKSB7CiAgYWNhX2dlbmVyYWxbW2pdXSA8LSBhcy5udW1lcmljKGFjYV9nZW5lcmFsW1tqXV0pCn0KCiMgU2F2ZSBVU0EgZGF0YSBzZXBhcmF0ZWx5CmFjYV9nZW5lcmFsX1VTQSA8LSBhY2FfZ2VuZXJhbFthY2FfZ2VuZXJhbCRzdGF0ZT09IlVuaXRlZCBTdGF0ZXMiLCBdCgojIERyb3AgVVNBIGFuZCBEQyBkYXRhCmFjYV9nZW5lcmFsIDwtIGFjYV9nZW5lcmFsWyEoYWNhX2dlbmVyYWwkc3RhdGUgJWluJSBjKCJVbml0ZWQgU3RhdGVzIiwgIkRpc3RyaWN0IG9mIENvbHVtYmlhIikpLCBdCgojIEFkZCBzdGF0ZSBhYmJyZXZpYXRpb25zCmFjYV9nZW5lcmFsJHN0YXRlX2FiYiA8LSBzdGF0ZV9hYmJyZXZpYXRpb25zCmFjYV9nZW5lcmFsIDwtIGFjYV9nZW5lcmFsWyAsIGMoMSwgbmNvbChhY2FfZ2VuZXJhbCksIDI6KG5jb2woYWNhX2dlbmVyYWwpLTEpKV0KCiMgRHJvcCByYXcgZGF0YQpybShhY2FfZ2VuZXJhbF9yYXcpCgoKIyMgQ0xFQU4gSEVBTFRIIElORElDQVRPUiBEQVRBCgojIEtlZXAgb25seSByZWxldmFudCByb3dzIGFuZCBjb2x1bW5zCmhlYWx0aF9pbmQgPC0gaGVhbHRoX2luZF9yYXdbNDo2NzAzLCBjKDEsIDM6NildCgojIExhYmVsIHZhcmlhYmxlcwpuYW1lcyhoZWFsdGhfaW5kKSA8LSBjKCJzdGF0ZSIsICJtZWFzdXJlIiwgInllYXIiLCAicmF0ZSIsICJyYW5rIikKCiMgU2ltcGxpZnkgZGF0ZSAoeWVhcnMpIC0gb25seSBrZWVwIGxhc3QgeWVhciBpZiByYW5nZSB3YXMgZ2l2ZW4KaGVhbHRoX2luZCR5ZWFyW2hlYWx0aF9pbmQkeWVhcj09IjA3LzIwMDkgLSAwNi8yMDEyIl0gPC0gIjIwMTIiCmhlYWx0aF9pbmQkeWVhcltoZWFsdGhfaW5kJHllYXI9PSIwNy8yMDEwIC0gMDYvMjAxMyJdIDwtICIyMDEzIgpoZWFsdGhfaW5kJHllYXJbaGVhbHRoX2luZCR5ZWFyPT0iMDcvMjAxMiAtIDA2LzIwMTUiXSA8LSAiMjAxNSIKaGVhbHRoX2luZCR5ZWFyW2hlYWx0aF9pbmQkeWVhcj09IjEwLzIwMTMtOS8yMDE0Il0gPC0gIjIwMTQiCmhlYWx0aF9pbmQkeWVhcltoZWFsdGhfaW5kJHllYXI9PSIyMDA4LTA5Il0gPC0gIjIwMDkiCmhlYWx0aF9pbmQkeWVhcltoZWFsdGhfaW5kJHllYXI9PSIyMDEwLTExIl0gPC0gIjIwMTEiCmhlYWx0aF9pbmQkeWVhcltoZWFsdGhfaW5kJHllYXI9PSIyMDExLTEyIl0gPC0gIjIwMTIiCmhlYWx0aF9pbmQkeWVhcltoZWFsdGhfaW5kJHllYXI9PSIyMDExLzEyIl0gPC0gIjIwMTIiCmhlYWx0aF9pbmQkeWVhcltoZWFsdGhfaW5kJHllYXI9PSIyMDEyLTEzIl0gPC0gIjIwMTMiCmhlYWx0aF9pbmQkeWVhcltoZWFsdGhfaW5kJHllYXI9PSIyMDEzLTE0Il0gPC0gIjIwMTQiCmhlYWx0aF9pbmQkeWVhcltoZWFsdGhfaW5kJHllYXI9PSIyMDEzKFEyLVE0KSJdIDwtICIyMDEzIgpoZWFsdGhfaW5kJHllYXJbaGVhbHRoX2luZCR5ZWFyPT0iMjAxNC0xNSJdIDwtICIyMDE1IgpoZWFsdGhfaW5kJHllYXJbaGVhbHRoX2luZCR5ZWFyPT0iMjAxNShRMi1RNCkiXSA8LSAiMjAxNSIKCiMgRXhwb3J0IHRvIGV4Y2VsIHRvIG1hbnVhbGx5IGxhYmVsIHZhcmlhYmxlIG5hbWVzCnVuaXF1ZV9tZWFzdXJlcyA8LSB1bmlxdWUoYXMuZmFjdG9yKGhlYWx0aF9pbmQkbWVhc3VyZSkpCiAgIyBDb3BpZWQgaW4gZnJvbSBleGNlbCBzaGVldAp1bmlxdWVfbWVhc3VyZXNfcmVsYWJlbGxlZCA8LSBjKCJhLnN1bW1hcnlfYWNjZXNzIiwgImEudW5pbnNfYWR1bHQiLCAiYS51bmluc19jaGlsZCIsICJhLm5vX2NhcmVfYmNfY29zdF9hZHVsdCIsICJhLmhpZ2hfT09QX3JlbGF0aXZlX3VuZGVyNjUiLCAiYS5hdF9yaXNrX25vX3JvdXRpbmVfZG9jX2FkdWx0IiwgImEubm9fZGVudGFsX2FkdWx0IiwgInEuc3VtbWFyeV9wcmV2X3RyZWF0IiwgInEud2l0aF91c3VhbF9jYXJlX2FkdWx0IiwgInEud2l0aF9jYW5jZXJfc2NyZWVuaW5nX2FkdWx0IiwgInEud2l0aF92YWNjaW5lc19hZHVsdCIsICJxLndpdGhfbWVkaWNhbF9ob21lX2NoaWxkIiwgInEud2l0aF9wcmV2X21lZGljYWxfZGVudGFsX2NoaWxkIiwgInEud2l0aF9tZW50YWxfaGVhbHRoY2FyZV9jaGlsZCIsICJxLndpdGhfdmFjY2luZXNfaW5mYW50IiwgInEuZHJ1Z19zaG91bGRfYXZvaWRfbWVkaWNhcmUiLCAicS5kcnVnX3Nob3VsZF9hdm9pZF8zY29uZGl0aW9uc19tZWRpY2FyZSIsICJxLmdvb2RfaGVhbHRoX3Byb3ZpZGVyX21lZGljYXJlIiwgInEubW9ydGFsaXR5XzRjb25kaXRpb25zX21lZGljYXJlIiwgInEuQ0xBQlNJX2luZmVjdGlvbl9yYXRpbyIsICJxLmluZm9fcmVjb3ZlcnlfaG9zcGl0YWxpemVkIiwgInEuZ29vZF9ob3NwaXRhbF9zdGFmZl9ob3NwaXRhbGl6ZWQiLCAicS5pbXByb3ZlX21vYmlsaXR5X2hvbWVoZWFsdGgiLCAicS5pbXByb3ZlZF93b3VuZHNfaG9tZWhlYWx0aCIsICJxLnNvcmVzX05IcmVzIiwgInEuYW50aXBzeWNob3RpY19tZWRfTkhyZXMiLCAidS5zdW1tYXJ5X2F2b2lkYWJsZV9ob3NwX2Nvc3QiLCAidS5ob3NwX2FzdGhtYV9jaGlsZCIsICJ1Lmhvc3BfYW1idWxhdG9yeV82NXRvNzR5cnMiLCAidS5ob3NwX2FtYnVsYXRvcnlfYWJvdmU3NXlycyIsICJ1LjMwZGF5X2hvc3BfcmVhZG1pdF9tZWRpY2FyZSIsICJ1LjMwZGF5X2hvc3BfcmVhZG1pdF9OSHJlcyIsICJ1Lmhvc3BfNm1vc19OSHJlcyIsICJ1Lmhvc3BfbWVkaWNhcmVfaG9tZWhlYWx0aCIsICJ1LmF2b2lkYWJsZV9FUl9tZWRpY2FyZSIsICJ1LnRvdF9yZWltYl9lbXBsb3llcl9pbnMiLCAidS50b3RfcmVpbWJfbWVkaWNhcmUiLCAiaC5zdW1tYXJ5X2hlYWx0aHlfbGl2ZXMiLCAiaC5kZWF0aHNfYW1lbmFibGUiLCAiaC55cnNfbG9zdF9wb3RlbnRpYWxfbGlmZV9iZWZvcmU3NSIsICJoLmRlYXRoc19icmVhc3RfY2FuY2VyX0YiLCAiaC5kZWF0aHNfY29sb3JlY3RhbF9jYW5jZXIiLCAiaC5kZWF0aHNfc3VpY2lkZSIsICJoLmRlYXRoc19pbmZhbnRfbW9ydGFsaXR5IiwgImgucG9vcl9oZWFsdGhfYWR1bHQiLCAiaC5zbW9rZV9hZHVsdCIsICJoLm9iZXNlX2FkdWx0IiwgImgub2Jlc2VfY2hpbGQiLCAiaC5wb29yX2RlbnRhbF9hZHVsdCIsICJ1LnByZW1pdW1fZW1wX3ByaXZhdGUiLCAidS5wcmVtaXVtX2VtcF9wcml2YXRlX3VuYWRqIiwgInUucmVpbWJfbWVkaWNhcmVfdW5hZGoiLCAidS5kZWF0aHNfYW1lbmFibGVfYmxhY2siLCAidS5kZWF0aHNfYW1lbmFibGVfd2hpdGUiLCBOQSwgInEud2l0aF9wcmV2X3NjcmVlbmluZ19hYm92ZTUweXJzIiwgTkEpCgojIFJlcGxhY2UgdmFyaWFibGUgbmFtZXMgd2l0aCBhYmJyZXZpYXRlZCB2ZXJzaW9uCmZvciAoaSBpbiAxOjU3KSB7CiAgaGVhbHRoX2luZCRtZWFzdXJlIDwtIHJlcGxhY2UoaGVhbHRoX2luZCRtZWFzdXJlLCBoZWFsdGhfaW5kJG1lYXN1cmU9PXVuaXF1ZV9tZWFzdXJlc1tpXSwgdW5pcXVlX21lYXN1cmVzX3JlbGFiZWxsZWRbaV0pCn0KCiMgUmVtb3ZlIHRoZSBOQSdzCmhlYWx0aF9pbmQgPC0gaGVhbHRoX2luZFshaXMubmEoaGVhbHRoX2luZCRtZWFzdXJlKSwgXQoKIyBSZW1vdmUgZHVwbGljYXRlcwogICMgQnkgc3RhdGUsIG1lYXN1cmUueWVhcgpoZWFsdGhfaW5kIDwtIGhlYWx0aF9pbmRbIWR1cGxpY2F0ZWQoaGVhbHRoX2luZFsgLCAxOjNdKSwgXQoKIyBJbnRlcmFjdCBtZWFzdXJlIGFuZCB5ZWFyCmhlYWx0aF9pbmQkbWVhc3VyZV95ZWFyIDwtIGludGVyYWN0aW9uKGhlYWx0aF9pbmQkbWVhc3VyZSwgaGVhbHRoX2luZCR5ZWFyKQoKIyBDb252ZXJ0IHRvIGNoYXJhY3RlciB2YXJpYWJsZQpoZWFsdGhfaW5kJG1lYXN1cmVfeWVhciA8LSBhcy5jaGFyYWN0ZXIoaGVhbHRoX2luZCRtZWFzdXJlX3llYXIpCgojIFByZS1yZXNoYXBlOiBTdG9yZSBleGlzdGluZyBkYXRhIGFzICJsb25nIgpoZWFsdGhfaW5kX2xvbmcgPC0gaGVhbHRoX2luZAoKIyBSZXNoYXBlIHdpZGUKaGVhbHRoX2luZCA8LSBhcy5kYXRhLmZyYW1lKGNiaW5kKGhlYWx0aF9pbmQkc3RhdGUsIGhlYWx0aF9pbmQkbWVhc3VyZV95ZWFyLCBoZWFsdGhfaW5kJHJhdGUpKQogICMgRHJvcCByYW5rIGRhdGEgZm9yIG5vdwpuYW1lcyhoZWFsdGhfaW5kKSA8LSBjKCJzdGF0ZSIsICJtZWFzdXJlX3llYXIiLCAicmF0ZSIpCmhlYWx0aF9pbmQgPC0gcmVzaGFwZShoZWFsdGhfaW5kLAogICAgICAgICAgICAgICAgICAgICAgICBpZHZhciA9ICJzdGF0ZSIsCiAgICAgICAgICAgICAgICAgICAgICAgIHRpbWV2YXIgPSAibWVhc3VyZV95ZWFyIiwKICAgICAgICAgICAgICAgICAgICAgICAgZGlyZWN0aW9uID0gIndpZGUiKQoKIyBEcm9wICJyYXRlIiBmcm9tIHRoZSBuYW1lCm5hbWVzKGhlYWx0aF9pbmQpWzI6bmNvbChoZWFsdGhfaW5kKV0gPC0gc3Vic3RyKG5hbWVzKGhlYWx0aF9pbmQpLCA2LCBuY2hhcihuYW1lcyhoZWFsdGhfaW5kKSkpWzI6bmNvbChoZWFsdGhfaW5kKV0KCiMgRHJvcCB2YXJpYWJsZXMgd2hvIGhhdmUgYWxsIGVudHJpZXMgYXMgTkEKICAjIER1ZSB0byAndW5iYWxhbmNlZCBwYW5lbCcgaW4gcmVzaGFwaW5nCiAgIyBGaXJzdCBjcmVhdGUgYSB2ZWN0b3IgdG8gcmVjb3JkIGlmIHZhcmlhYmxlIGlzIGFsbCBOQQp2YXJpYWJsZV9hbGxfTkEgPC0gdmVjdG9yKG1vZGU9ImxvZ2ljYWwiLCBsZW5ndGg9bmNvbChoZWFsdGhfaW5kKSkKZm9yIChqIGluIDE6bmNvbChoZWFsdGhfaW5kKSkgewogIGlmKHN1bShpcy5uYShoZWFsdGhfaW5kW1tqXV0pKT09NTIpIHsKICAgIHZhcmlhYmxlX2FsbF9OQVtqXSA8LSBUUlVFCiAgfQp9CiAgIyBPbmx5IGtlZXAgdGhlIHZhcmlhYmxlcyB0aGF0IGFyZSBOT1QgYWxsIE5BCmhlYWx0aF9pbmQgPC0gaGVhbHRoX2luZFsgLCAhdmFyaWFibGVfYWxsX05BXQoKIyBDaGFuZ2UgZm9ybWF0IG9mIHZhcmlhYmxlcwogICMgVG8gY2hhcmFjdGVyIHZhcmlhYmxlCmhlYWx0aF9pbmQkc3RhdGUgPC0gYXMuY2hhcmFjdGVyKGhlYWx0aF9pbmQkc3RhdGUpCiAgIyBUbyBudW1lcmljIHZhcmlhYmxlCmZvciAoaiBpbiBjKDI6MTY0KSkgewogIGhlYWx0aF9pbmRbW2pdXSA8LSBhcy5jaGFyYWN0ZXIoaGVhbHRoX2luZFtbal1dKQogIGhlYWx0aF9pbmRbW2pdXSA8LSBhcy5udW1lcmljKGhlYWx0aF9pbmRbW2pdXSkKfQoKIyBTYXZlIFVTQSBkYXRhIHNlcGFyYXRlbHkKaGVhbHRoX2luZF9VU0EgPC0gaGVhbHRoX2luZFtoZWFsdGhfaW5kJHN0YXRlPT0iVW5pdGVkIFN0YXRlcyIsIF0KCiMgRHJvcCBVU0EgYW5kIERDIGRhdGEKaGVhbHRoX2luZCA8LSBoZWFsdGhfaW5kWyEoaGVhbHRoX2luZCRzdGF0ZSAlaW4lIGMoIlVuaXRlZCBTdGF0ZXMiLCAiRGlzdHJpY3Qgb2YgQ29sdW1iaWEiKSksIF0KCiMgTGFiZWwgc3RhdGUgYWJicmV2aWF0aW9ucwpoZWFsdGhfaW5kJHN0YXRlX2FiYiA8LSBzdGF0ZV9hYmJyZXZpYXRpb25zCmhlYWx0aF9pbmQgPC0gaGVhbHRoX2luZFsgLCBjKDEsIG5jb2woaGVhbHRoX2luZCksIDI6KG5jb2woaGVhbHRoX2luZCktMSkpXQoKIyBEcm9wIHJhdyBkYXRhCnJtKGhlYWx0aF9pbmRfcmF3KQoKCiMjIENMRUFOIERFTU9HUkFQSElDICgxKSBEQVRBCgojIERyb3AgdW5uZWNlc3Nhcnkgcm93IGFuZCBjb2x1bW4KZGVtb2dyYXBoaWNzMSA8LSBkZW1vZ3JhcGhpY3MxWy0xLC0xXQoKIyBSZW5hbWUgdmFyaWFibGVzCmNvbG5hbWVzKGRlbW9ncmFwaGljczEpIDwtIGMoInN0YXRlIiwiaW5jb21lIiwicG9wdWxhdGlvbiIsICJwcGxfYWdlMHRvNCIsInBwbF9hZ2U1dG85IiwicHBsX2FnZTEwdG8xNCIsInBwbF9hZ2UxNXRvMTkiLCJwcGxfYWdlMjB0bzI0IiwgInBwbF9hZ2UyNXRvMjkiLCJwcGxfYWdlMzB0bzM0IiwicHBsX2FnZTM1dG8zOSIsInBwbF9hZ2U0MHRvNDQiLCAicHBsX2FnZTQ1dG80OSIsInBwbF9hZ2U1MHRvNTQiLCJwcGxfYWdlNTV0bzU5IiwicHBsX2FnZTYwdG82NCIsICJwcGxfYWdlNjV0bzY5IiwicHBsX2FnZTcwdG83NCIsInBwbF9hZ2U3NXRvNzkiLCJwcGxfYWdlODB0bzg0IiwicHBsX2FnZTg1cGx1cyIpCgojIERyb3Agb2JzZXJ2YXRpb25zIERDIGFuZCBQUgpkZW1vZ3JhcGhpY3MxIDwtIGRlbW9ncmFwaGljczFbIWRlbW9ncmFwaGljczEkc3RhdGU9PSJEaXN0cmljdCBvZiBDb2x1bWJpYSIgJiAhZGVtb2dyYXBoaWNzMSRzdGF0ZT09IlB1ZXJ0byBSaWNvIiwgXQoKIyBMYWJlbCBzdGF0ZSBhYmJyZXZpYXRpb25zCmRlbW9ncmFwaGljczEkc3RhdGVfYWJiIDwtIHN0YXRlX2FiYnJldmlhdGlvbnMKZGVtb2dyYXBoaWNzMSA8LSBkZW1vZ3JhcGhpY3MxWyAsIGMoMSwgbmNvbChkZW1vZ3JhcGhpY3MxKSwgMjoobmNvbChkZW1vZ3JhcGhpY3MxKS0xKSldCgojIENoYW5nZSBmb3JtYXQgb2YgdmFyaWFibGVzCiAgIyBUbyBjaGFyYWN0ZXIgdmFyaWFibGUKZGVtb2dyYXBoaWNzMSRzdGF0ZSA8LSBhcy5jaGFyYWN0ZXIoZGVtb2dyYXBoaWNzMSRzdGF0ZSkKICAjIFRvIG51bWVyaWMgdmFyaWFibGUKZm9yIChqIGluIGMoMzpuY29sKGRlbW9ncmFwaGljczEpKSkgewogIGRlbW9ncmFwaGljczFbW2pdXSA8LSBhcy5jaGFyYWN0ZXIoZGVtb2dyYXBoaWNzMVtbal1dKQogIGRlbW9ncmFwaGljczFbW2pdXSA8LSBhcy5udW1lcmljKGRlbW9ncmFwaGljczFbW2pdXSkKfQoKIyBCRUEgcmVnaW9ucwpkZW1vZ3JhcGhpY3MxJEJFQV9yZWdpb24gPC0gIiIKZGVtb2dyYXBoaWNzMSRCRUFfcmVnaW9uW2RlbW9ncmFwaGljczEkc3RhdGVfYWJiICVpbiUgYygiTUUiLCAiTkgiLCAiVlQiLCAiTUEiLCAiQ1QiLCAiUkkiKV0gPC0gIk5ldyBFbmdsYW5kIgpkZW1vZ3JhcGhpY3MxJEJFQV9yZWdpb25bZGVtb2dyYXBoaWNzMSRzdGF0ZV9hYmIgJWluJSBjKCJOWSIsICJOSiIsICJQQSIsICJNRCIsICJERSIpXSA8LSAiTWlkZWFzdCIKZGVtb2dyYXBoaWNzMSRCRUFfcmVnaW9uW2RlbW9ncmFwaGljczEkc3RhdGVfYWJiICVpbiUgYygiV0kiLCAiSUwiLCAiTUkiLCAiSU4iLCAiT0giKV0gPC0gIkdyZWF0IExha2VzIgpkZW1vZ3JhcGhpY3MxJEJFQV9yZWdpb25bZGVtb2dyYXBoaWNzMSRzdGF0ZV9hYmIgJWluJSBjKCJXViIsICJLWSIsICJWQSIsICJUTiIsICJOQyIsICJTQyIsICJBUiIsICJMQSIsICJNUyIsICJBTCIsICJHQSIsICJGTCIpXSA8LSAiU291dGhlYXN0IgpkZW1vZ3JhcGhpY3MxJEJFQV9yZWdpb25bZGVtb2dyYXBoaWNzMSRzdGF0ZV9hYmIgJWluJSBjKCJORCIsICJTRCIsICJORSIsICJLUyIsICJNTiIsICJJQSIsICJNTyIpXSA8LSAiUGxhaW5zIgpkZW1vZ3JhcGhpY3MxJEJFQV9yZWdpb25bZGVtb2dyYXBoaWNzMSRzdGF0ZV9hYmIgJWluJSBjKCJNVCIsICJJRCIsICJXWSIsICJVVCIsICJDTyIpXSA8LSAiUm9ja3kgTW91bnRhaW5zIgpkZW1vZ3JhcGhpY3MxJEJFQV9yZWdpb25bZGVtb2dyYXBoaWNzMSRzdGF0ZV9hYmIgJWluJSBjKCJBWiIsICJOTSIsICJUWCIsICJPSyIpXSA8LSAiU291dGh3ZXN0IgpkZW1vZ3JhcGhpY3MxJEJFQV9yZWdpb25bZGVtb2dyYXBoaWNzMSRzdGF0ZV9hYmIgJWluJSBjKCJXQSIsICJPUiIsICJDQSIsICJOViIsICJBSyIsICJISSIpXSA8LSAiRmFyIFdlc3QiCgojIFRhZyBpbmNvbWUgbGV2ZWwgKGNhdGVnb3J5KQpkZW1vZ3JhcGhpY3MxJGluY29tZV9sZXZlbCA8LSAiIgpkZW1vZ3JhcGhpY3MxJGluY29tZV9sZXZlbFtkZW1vZ3JhcGhpY3MxJGluY29tZSA+PSA2MDAwMF0gPC0gIkhpZ2giCmRlbW9ncmFwaGljczEkaW5jb21lX2xldmVsW2RlbW9ncmFwaGljczEkaW5jb21lID49IDUwMDAwICYgZGVtb2dyYXBoaWNzMSRpbmNvbWUgPCA2MDAwMF0gPC0gIlVwcGVyIE1pZGRsZSIKZGVtb2dyYXBoaWNzMSRpbmNvbWVfbGV2ZWxbZGVtb2dyYXBoaWNzMSRpbmNvbWUgPj0gNDUwMDAgJiBkZW1vZ3JhcGhpY3MxJGluY29tZSA8IDUwMDAwXSA8LSAiTG93ZXIgTWlkZGxlIgpkZW1vZ3JhcGhpY3MxJGluY29tZV9sZXZlbFtkZW1vZ3JhcGhpY3MxJGluY29tZSA8IDQ1MDAwXSA8LSAiTG93IgogICMgQ29udmVydCB0byBmYWN0b3IgdmFyaWFibGUKZGVtb2dyYXBoaWNzMSRpbmNvbWVfbGV2ZWwgPC0gZmFjdG9yKGRlbW9ncmFwaGljczEkaW5jb21lX2xldmVsLCBsZXZlbHMgPSBjKCJMb3ciLCAiTG93ZXIgTWlkZGxlIiwgIlVwcGVyIE1pZGRsZSIsICJIaWdoIikpCgoKIyMgQ0xFQU4gREVNT0dSQVBISUMgKDIpIERBVEEKCmNvbG5hbWVzKGRlbW9ncmFwaGljczIpIDwtIGRlbW9ncmFwaGljczJbMiwgXQoKIyBEcm9wIGZpcnN0IGZldyByb3dzIChub24tb2JzZXJ2YXRpb25zKQpkZW1vZ3JhcGhpY3MyIDwtIGRlbW9ncmFwaGljczJbLSgxOjIpLCBdCgojIERyb3AgY291bnR5LWxldmVsIGRhdGEsICBrZWVwIHN0YXRlLWxldmVsIGRhdGEgb25seQpkZW1vZ3JhcGhpY3MyIDwtIGRlbW9ncmFwaGljczJbZGVtb2dyYXBoaWNzMiRBcmVhX05hbWUgPT0gIlVuaXRlZCBTdGF0ZXMiIHwgZGVtb2dyYXBoaWNzMiRTdGF0ZSAhPSBsYWcoZGVtb2dyYXBoaWNzMiRTdGF0ZSksIF0KCiMgS2VlcCBvbmx5IGNvbHVtbnMgb2YgcG9wdWxhdGlvbiBmcm9tIDIwMTAgdG8gMjAxNQpkZW1vZ3JhcGhpY3MyIDwtIGRlbW9ncmFwaGljczJbICwgYygiU3RhdGUiLCAiQXJlYV9OYW1lIiwgIlBPUF9FU1RJTUFURV8yMDEwIiwgIlBPUF9FU1RJTUFURV8yMDExIiwgIlBPUF9FU1RJTUFURV8yMDEyIiwgIlBPUF9FU1RJTUFURV8yMDEzIiwgIlBPUF9FU1RJTUFURV8yMDE0IiwgIlBPUF9FU1RJTUFURV8yMDE1IildCgojIENoYW5nZSBmb3JtYXQgb2YgdmFyaWFibGVzCiAgIyBUbyBjaGFyYWN0ZXIgdmFyaWFibGUKZm9yIChqIGluIGMoMzo4KSkgewogIGRlbW9ncmFwaGljczJbW2pdXSA8LSBhcy5udW1lcmljKGRlbW9ncmFwaGljczJbW2pdXSkKfQoKIyBSZW5hbWUgdmFyaWFibGVzCmNvbG5hbWVzKGRlbW9ncmFwaGljczIpIDwtIGMoInN0YXRlX2FiYiIsICJzdGF0ZSIsICJwb3B1bGF0aW9uXzIwMTAiLCAicG9wdWxhdGlvbl8yMDExIiwgInBvcHVsYXRpb25fMjAxMiIsICJwb3B1bGF0aW9uXzIwMTMiLCAicG9wdWxhdGlvbl8yMDE0IiwgInBvcHVsYXRpb25fMjAxNSIpCgoKIyMgQ0xFQU4gRUxFQ1RJT04gREFUQQoKIyBLZWVwIG9ubHkgMjAxMiBhbmQgMjAwOCBkYXRhLCBhbmQgZGF0YSBmb3IgdGhlIDUwIHN0YXRlcwplbGVjdGlvbiA8LSBlbGVjdGlvblsgNDo1MyAsIGMoIlgwIiwgIlg1IiwgIlg2IiwgIlg5IiwgIlgxMCIpXQoKIyBSZW5hbWUgdmFyaWFibGVzCmNvbG5hbWVzKGVsZWN0aW9uKSA8LSBjKCJzdGF0ZSIsICJEZW1fcGN0XzIwMTIiLCAiUmVwX3BjdF8yMDEyIiwgIkRlbV9wY3RfMjAwOCIsICJSZXBfcGN0XzIwMDgiKQoKIyBBZGQgc3RhdGUgYWJicmV2aWF0aW9ucwogICMgTWF0Y2ggd2l0aCBsb29rLXVwIHRhYmxlCmVsZWN0aW9uJHN0YXRlX2FiYiA8LSBzdGF0ZV9hYmJfbG9va3VwJHN0YXRlX2FiYlttYXRjaChlbGVjdGlvbiRzdGF0ZSwgc3RhdGVfYWJiX2xvb2t1cCRzdGF0ZSldCgojIENoYW5nZSBmb3JtYXQgb2YgdmFyaWFibGVzCiAgIyBUbyBudW1lcmljIHZhcmlhYmxlCmZvciAoaiBpbiBjKDQ6NikpIHsKICBlbGVjdGlvbltbal1dIDwtIGFzLm51bWVyaWMoZWxlY3Rpb25bW2pdXSkKfQoKIyBDYWxjdWxhdGUgd2lubmluZyBwYXJ0eSBmb3IgZWFjaCBzdGF0ZQplbGVjdGlvbiRwYXJ0eV8yMDEyIDwtIGlmZWxzZShlbGVjdGlvbiREZW1fcGN0XzIwMTIgPiBlbGVjdGlvbiRSZXBfcGN0XzIwMTIsICJEZW1vY3JhdGljIiwgIlJlcHVibGljYW4iKQplbGVjdGlvbiRwYXJ0eV8yMDA4IDwtIGlmZWxzZShlbGVjdGlvbiREZW1fcGN0XzIwMDggPiBlbGVjdGlvbiRSZXBfcGN0XzIwMDgsICJEZW1vY3JhdGljIiwgIlJlcHVibGljYW4iKQoKIyBSZW9yZGVyIHZhcmlhYmxlcwplbGVjdGlvbiA8LSBlbGVjdGlvblsgLCBjKCJzdGF0ZSIsICJzdGF0ZV9hYmIiLCAiRGVtX3BjdF8yMDEyIiwgIlJlcF9wY3RfMjAxMiIsICJwYXJ0eV8yMDEyIiwgIkRlbV9wY3RfMjAwOCIsICJSZXBfcGN0XzIwMDgiLCAicGFydHlfMjAwOCIpXQpgYGAKCgojICgxKSBIZWFsdGggSW5zdXJhbmNlIENvdmVyYWdlCgpfX0ZpZ3VyZSAxX18KCkFjY2VzcyBvdXIgU2hpbnkgQXBwIG9uIFtVbmluc3VyZWQgUmF0ZXMgaW4gdGhlIFVuaXRlZCBTdGF0ZXMgZnJvbSAyMDA4LTIwMTVdKGh0dHBzOi8vZ3JhY2Vrb25neXguc2hpbnlhcHBzLmlvL2hlYWx0aF9pbnN1cmFuY2Vfc2hpbnkvKS4KICAgCiAgIAoKYGBge3IsIGV2YWwgPSBUUlVFLCBlY2hvID0gRkFMU0UsIHdhcm5pbmcgPSBGQUxTRSwgdGlkeSA9IFRSVUV9CiMjIFNPTUUgREFUQSBQUkVQQVJBVElPTgoKIyBMb29rLXVwIGluZm9ybWF0aW9uIGludG8gaW5zdXJhbmNlIGFuZCBpbnN1cmFuY2VfbG9uZywgb246CiAgIyBQYXJ0eSAoMjAxMikKaW5zdXJhbmNlX2xvbmckcGFydHlfMjAxMiA8LSBlbGVjdGlvbiRwYXJ0eV8yMDEyW21hdGNoKGluc3VyYW5jZV9sb25nJHN0YXRlLCBlbGVjdGlvbiRzdGF0ZSldCmluc3VyYW5jZSRwYXJ0eV8yMDEyIDwtIGVsZWN0aW9uJHBhcnR5XzIwMTJbbWF0Y2goaW5zdXJhbmNlJHN0YXRlLCBlbGVjdGlvbiRzdGF0ZSldCiAgIyBCRUEgcmVnaW9uCmluc3VyYW5jZV9sb25nJEJFQV9yZWdpb24gPC0gZGVtb2dyYXBoaWNzMSRCRUFfcmVnaW9uW21hdGNoKGluc3VyYW5jZV9sb25nJHN0YXRlLCBkZW1vZ3JhcGhpY3MxJHN0YXRlKV0KaW5zdXJhbmNlJEJFQV9yZWdpb24gPC0gZGVtb2dyYXBoaWNzMSRCRUFfcmVnaW9uW21hdGNoKGluc3VyYW5jZSRzdGF0ZSwgZGVtb2dyYXBoaWNzMSRzdGF0ZSldCiAgIyBJbmNvbWUgbGV2ZWwKaW5zdXJhbmNlX2xvbmckaW5jb21lX2xldmVsIDwtIGRlbW9ncmFwaGljczEkaW5jb21lX2xldmVsW21hdGNoKGluc3VyYW5jZV9sb25nJHN0YXRlLCBkZW1vZ3JhcGhpY3MxJHN0YXRlKV0KaW5zdXJhbmNlJGluY29tZV9sZXZlbCA8LSBkZW1vZ3JhcGhpY3MxJGluY29tZV9sZXZlbFttYXRjaChpbnN1cmFuY2Ukc3RhdGUsIGRlbW9ncmFwaGljczEkc3RhdGUpXQoKIyBBbHNvIGZpbmQgbmF0aW9uLXdpZGUgdHJlbmQgZm9yIGluc3VyYW5jZQppbnN1cmFuY2VfbG9uZ19VUyA8LSBkYXRhLmZyYW1lKCJ5ZWFyIiA9IGMoMjAwOCwgMjAwOSwgMjAxMCwgMjAxMSwgMjAxMiwgMjAxMywgMjAxNCwgMjAxNSksICJ1bmluc3VyZWRfcGN0IiA9IGMoMTYuOCwgMTcuNSwgMTguMiwgMTcuMiwgMTYuOSwgMTYuNiwgMTMuMywgMTAuNSkpCmBgYAoKX19GaWd1cmUgMl9fCiAgIApUaGUgZm9sbG93aW5nIGZpZ3VyZSBkaXNwbGF5cyB0aGUgdHJlbmQgaW4gdGhlIHVuaW5zdXJlZCByYXRlIGJldHdlZW4gMjAwOCBhbmQgMjAxNS4gUmVzdWx0cyBhcmUgc2hvd24gZm9yIHRoZSBVU0EgYXZlcmFnZSAoaW4gYmxhY2spLCBhcyB3ZWxsIGFzIGZvciBldmVyeSBpbmRpdmlkdWFsIHN0YXRlIChpbiBjb2xvcikuIAoKV2Ugc2VlIGEgY2xlYXIgZG93bndhcmQgdHJlbmQgaW4gdGhlIHVuaW5zdXJlZCByYXRlIG9uY2UgbW9zdCBvZiB0aGUgQWZmb3JkYWJsZSBDYXJlIEFjdCAoQUNBKSBwcm92aXNpb25zIHdlcmUgaW1wbGVtZW50ZWQgaW4gMjAxNC4gVGhlIG92ZXJhbGwgVVMgdW5pbnN1cmVkIHJhdGUgZGVjcmVhc2VkIGZyb20gMTguMiUgaW4gMjAxMCB0byAxMC41JSBpbiAyMDE1LgoKSG93ZXZlciwgbm90ZSB0aGF0IHRoZSBkaXNwYXJpdGllcyBpbiB1bmluc3VyZWQgcmF0ZXMgbGFyZ2VseSBjb250aW51ZSB0byBwZXJzaXN0IGFtb25nIHRoZSBzdGF0ZXMsIHdpdGggcmVnaW9uYWwgcGF0dGVybnMgKHVzaW5nIEJ1cmVhdSBvZiBFY29ub21pYyBBbmFseXNpcyAoQkVBKSByZWdpb25zKS4gU3RhdGVzIG9mIHRoZSBTb3V0aGVhc3QgYW5kIFNvdXRod2VzdCBjb25zaXN0ZW50bHkgaGFkIHRoZSBoaWdoZXN0IHVuaW5zdXJlZCByYXRlcywgd2hpbGUgc3RhdGVzIG9mIE5ldyBFbmdsYW5kIGNvbnNpc3RlbmVseSBoYWQgdGhlIGxvd2VzdCBpbnN1cmVkIG9yIGhpZ2hlc3QgaGVhbHRoIGluc3VyYW5jZSBjb3ZlcmFnZSByYXRlcy4KICAgCmBgYHtyLCBldmFsID0gVFJVRSwgZWNobyA9IEZBTFNFLCB3YXJuaW5nID0gRkFMU0UsIHRpZHkgPSBUUlVFfQojIyBQTE9UIDIKCnBsb3QxIDwtIChnZ3Bsb3QoaW5zdXJhbmNlX2xvbmcsIGFlcyh5ZWFyLCB1bmluc3VyZWRfcGN0KSkgCiAgICAgICAgICArIGdlb21fbGluZShhZXMoY29sb3IgPSBCRUFfcmVnaW9uLCBncm91cCA9IHN0YXRlLCBsYWJlbCA9IHVuaW5zdXJlZF9udW0pKQogICAgICAgICAgKyBzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzID0gYygyMDA4LCAyMDA5LCAyMDEwLCAyMDExLCAyMDEyLCAyMDEzLCAyMDE0LCAyMDE1KSkKICAgICAgICAgICsgc2NhbGVfeV9jb250aW51b3VzKGJyZWFrcyA9IGMoNSwgMTAsIDE1LCAyMCwgMjUsIDMwKSkKICAgICAgICAgICsgbGFicyh4ID0gIlllYXIiLCB5ID0gIiUgVW5pbnN1cmVkIiwgY29sb3IgPSAiUmVnaW9uIikKICAgICAgICAgICsgZ2VvbV9saW5lKGRhdGEgPSBpbnN1cmFuY2VfbG9uZ19VUywgbHdkID0gMC44KQogICAgICAgICAgKyBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAyMDEwLCBsaW5ldHlwZSA9IDIsIGNvbG9yID0gImdyYXkzMCIpCiAgICAgICAgICArIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IDIwMTQsIGxpbmV0eXBlID0gMiwgY29sb3IgPSAiZ3JheTMwIikKICAgICAgICAgICsgYW5ub3RhdGUoInRleHQiLHggPSAyMDA5LjQsIHkgPSAyNSwgbGFiZWwgPSAiT2JhbWEgXG5zaWducyBBQ0EiLCBjb2xvciA9ICJibGFjayIsZm9udGZhY2UgPSAyLCBzaXplID0gMykKICAgICAgICAgICsgYW5ub3RhdGUoInRleHQiLHggPSAyMDEzLjQsIHkgPSAyNC41LCBsYWJlbCA9ICJNb3N0IEFDQSBcbnByb3Zpc2lvbnMgXG50YWtlIGVmZmVjdCIsIGNvbG9yID0gImJsYWNrIixmb250ZmFjZSA9IDIsIHNpemUgPSAzKQogICAgICAgICAgKyBhbm5vdGF0ZSgidGV4dCIseCA9IDIwMTQuMiwgeSA9IDExLCBsYWJlbCA9ICJVU0EgXG5BdmVyYWdlIiwgY29sb3IgPSAiYmxhY2siLGZvbnRmYWNlID0gMiwgc2l6ZSA9IDMpCiAgICAgICAgICArIGdndGl0bGUoIkNoYW5nZSBpbiBQZXJjZW50YWdlIFVuaW5zdXJlZCBieSBTdGF0ZSwgXG5mcm9tIDIwMDggdG8gMjAxNSIpCiAgICAgICAgICArIHRoZW1lX21pbmltYWwoKQogICAgICAgICAgKyB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGZhY2U9ImJvbGQiLCBoanVzdCA9IDAsIHNpemUgPSAxMikpKQpnZ3Bsb3RseShwbG90MSwgZHluYW1pY1RpY2tzID0gRkFMU0UsIHRvb2x0aXAgPSBjKCJzdGF0ZSIsICJ5ZWFyIiwgInVuaW5zdXJlZF9wY3QiLCAidW5pbnN1cmVkX251bSIpKQpgYGAKICAgCl9fRmlndXJlIDNfXwoKSW4gdGhlIGZvbGxvd2luZyBwbG90LCBJIGV4cGxvcmUgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiBEZW1vY3JhdGljIGFuZCBSZXB1YmxpY2FuIHN0YXRlcywgYmFzZWQgb24gdGhlIDIwMTIgVVMgUHJlc2lkZW50aWFsIEVsZWN0aW9uIHJlc3VsdHMuIEdlbmVyYWxseSwgdGhlIGRlbW9jcmF0aWMgc3RhdGVzIGNvbnNpc3RlbnRseSBoYXZlIGhhZCBsYXJnZWx5IGhhdmUgYSBsb3dlciB1bmluc3VyZWQgcmF0ZSB0aGFuIHRoZSBSZXB1YmxpY2FuIHN0YXRlcywgdGhvdWdoIGJvdGggZ3JvdXBzIGV4cGVyaWVuY2VkIGRlY2xpbmVzIGluIHRoZSB1bmluc3VyZWQgcmF0ZXMgaW4gMjAxNC4gVGhlIHJhdGUgb2YgZGVjbGluZSBvZiB1bmluc3VyZWQgcmF0ZXMgaW4gMjAxNCBmb3IgbWFueSBSZXB1YmxpY2FuIHN0YXRlcyBhcHBlYXJlZCB0byBleGNlZWQgdGhhdCBvZiB0aGUgRGVtb2NyYXRpYyBzdGF0ZXMsIG1haW5seSBiZWNhdXNlIG9mIHRoZWlyIGhpZ2hlciBzdGFydGluZyBwb2ludC4KCmBgYHtyLCBldmFsID0gVFJVRSwgZWNobyA9IEZBTFNFLCB3YXJuaW5nID0gRkFMU0UsIHRpZHkgPSBUUlVFfQojIyBQTE9UIDMKcGxvdDIgPC0gKGdncGxvdChpbnN1cmFuY2VfbG9uZywgYWVzKHllYXIsIHVuaW5zdXJlZF9wY3QpKSAKICAgICAgICAgICsgZ2VvbV9saW5lKGFlcyhjb2xvciA9IHBhcnR5XzIwMTIsIGdyb3VwID0gc3RhdGUsIGxhYmVsID0gdW5pbnN1cmVkX251bSkpCiAgICAgICAgICArIHNjYWxlX3hfY29udGludW91cyhicmVha3MgPSBjKDIwMDgsIDIwMDksIDIwMTAsIDIwMTEsIDIwMTIsIDIwMTMsIDIwMTQsIDIwMTUpKQogICAgICAgICAgKyBzY2FsZV95X2NvbnRpbnVvdXMoYnJlYWtzID0gYyg1LCAxMCwgMTUsIDIwLCAyNSwgMzApKQogICAgICAgICAgKyBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gYygic3RlZWwgYmx1ZSIsICJmaXJlYnJpY2sxIikpIAogICAgICAgICAgKyBsYWJzKHggPSAiWWVhciIsIHkgPSAiJSBVbmluc3VyZWQiLCBjb2xvciA9ICJQYXJ0eSBcbigyMDEyIFdpbm5lcikiKQogICAgICAgICAgKyBnZW9tX2xpbmUoZGF0YSA9IGluc3VyYW5jZV9sb25nX1VTLCBsd2QgPSAxKQogICAgICAgICAgKyBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAyMDEwLCBsaW5ldHlwZSA9IDIsIGNvbG9yID0gImdyYXkzMCIpCiAgICAgICAgICArIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IDIwMTQsIGxpbmV0eXBlID0gMiwgY29sb3IgPSAiZ3JheTMwIikKICAgICAgICAgICsgYW5ub3RhdGUoInRleHQiLHggPSAyMDA5LjQsIHkgPSAyNSwgbGFiZWwgPSAiT2JhbWEgXG5zaWducyBBQ0EiLCBjb2xvciA9ICJibGFjayIsZm9udGZhY2UgPSAyLCBzaXplID0gMykKICAgICAgICAgICsgYW5ub3RhdGUoInRleHQiLHggPSAyMDEzLjQsIHkgPSAyNC41LCBsYWJlbCA9ICJNb3N0IEFDQSBcbnByb3Zpc2lvbnMgXG50YWtlIGVmZmVjdCIsIGNvbG9yID0gImJsYWNrIixmb250ZmFjZSA9IDIsIHNpemUgPSAzKQogICAgICAgICAgKyBhbm5vdGF0ZSgidGV4dCIseCA9IDIwMTQuMiwgeSA9IDExLCBsYWJlbCA9ICJVU0EgXG5BdmVyYWdlIiwgY29sb3IgPSAiYmxhY2siLGZvbnRmYWNlID0gMiwgc2l6ZSA9IDMpCiAgICAgICAgICArIGdndGl0bGUoIkNoYW5nZSBpbiBQZXJjZW50YWdlIFVuaW5zdXJlZCBieSBQYXJ0eSwgXG5mcm9tIDIwMDggdG8gMjAxNSIpCiAgICAgICAgICArIHRoZW1lX21pbmltYWwoKQogICAgICAgICAgKyB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGZhY2U9ImJvbGQiLCBoanVzdCA9IDAsIHNpemUgPSAxMikpKQpnZ3Bsb3RseShwbG90MiwgZHluYW1pY1RpY2tzID0gRkFMU0UsICB0b29sdGlwID0gYygic3RhdGUiLCAieWVhciIsICJ1bmluc3VyZWRfcGN0IiwgInVuaW5zdXJlZF9udW0iKSkKYGBgCgpfX0ZpZ3VyZSA0X18KClRoaXMgcGxvdCBzaG93cyBpbnN1cmVkIHJhdGVzIGluIDIwMTUgYXQgYSBnbGFuY2UsIGxvb2tpbmcgYXQgaG93IHRoZXkgZGlmZmVyIGJ5IHBhcnR5ICgyMDEyIHdpbm5lciksIEJFQSByZWdpb24gYW5kIGluY29tZSBsZXZlbCBvZiB0aGUgc3RhdGVzLiAKCkluIHRlcm1zIG9mIGNvcnJlbGF0aW9ucywgaXQgYXBwZWFycyB0aGF0IGJlaW5nIGEgRGVtb2NyYXRpYyBzdGF0ZSBpcyBhIHN0cm9uZyBwcmVkaWN0b3Igb2YgYSBoaWdoZXIgaW5zdXJhbmNlIHJhdGUuIFN0YXRlcyBpbiBOZXcgRW5nbGFuZCwgdGhlIE1pZGVhc3QgYW5kIHRoZSBHcmVhdCBMYWtlcyBwZXJmb3JtIHdlbGwgaW4gaW5zdXJhbmNlIHJhdGVzLCB3aGlsZSBzdGF0ZXMgaW4gdGhlIFNvdXRod2VzdCwgUm9ja3kgTW91bnRhaW5zIGFuZCBTb3V0aGVhc3QgcGVyZm9ybSB0aGUgcG9vcmVzdC4gQXMgZXhwZWN0ZWQsIGhpZ2gtaW5jb21lIHN0YXRlcyBoYXZlIHRoZSBoaWdoZXN0IGluc3VyYW5jZSByYXRlcyBhcyBtb3JlIHBlb3BsZSB3b3VsZCBiZSBhYmxlIHRvIGFmZm9yZCBpbnN1cmFuY2UuIExvd2VyIGFuZCBsb3dlci1taWRkbGUgaW5jb21lIHN0YXRlcyBoYXZlIGxvd2VyIGNvdmVyYWdlIHJhdGVzLCBidXQgaXQgaXMgaW5mYWN0IHRoZSBsb3dlci1taWRkbGUgaW5jb21lIHN0YXRlcyB0aGF0IGhhdmUgdGhlIGxvd2VzdCBpbnN1cmFuY2UgcmF0ZXMuCgpgYGB7ciwgZXZhbCA9IFRSVUUsIGVjaG8gPSBGQUxTRSwgd2FybmluZyA9IEZBTFNFLCB0aWR5ID0gVFJVRX0KIyMgUExPVCA0CgojIFN1YnNldCByZWxldmFudCB2YXJpYWJsZXMKaW5zdXJhbmNlXzIwMTUgPC0gaW5zdXJhbmNlWyAsIGMoInN0YXRlIiwgInVuaW5zdXJlZF9wY3RfMjAxNSIsICJpbnN1cmVkX3BjdF8yMDE1IiwgInBhcnR5XzIwMTIiLCAiQkVBX3JlZ2lvbiIsICJpbmNvbWVfbGV2ZWwiKV0KCiMgQm94cGxvdHMgYnkgcGFydHkKcGxvdDNhIDwtIChnZ3Bsb3QoaW5zdXJhbmNlXzIwMTUsIGFlcyh4ID0gcmVvcmRlcihwYXJ0eV8yMDEyLCBpbnN1cmVkX3BjdF8yMDE1KSwgeSA9IGluc3VyZWRfcGN0XzIwMTUpKSAKICAgICAgICAgICsgZ2VvbV9ib3hwbG90KGFlcyhmaWxsID0gcGFydHlfMjAxMiwgbGFiZWwgPSBpbnN1cmVkX3BjdF8yMDE1KSwgY29sb3IgPSAiZ3JheTMwIikKICAgICAgICAgICsgY29vcmRfZmxpcCgpCiAgICAgICAgICArIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGMoInN0ZWVsIGJsdWUiLCAiZmlyZWJyaWNrIikpCiAgICAgICAgICArIGdndGl0bGUoIkRlbW9jcmF0aWMgdnMuIFJlcHVibGljYW4gU3RhdGVzIikKICAgICAgICAgICsgdGhlbWVfbWluaW1hbCgpCiAgICAgICAgICArIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoZmFjZT0iYm9sZCIsIGhqdXN0ID0gMC4zNywgc2l6ZSA9IDEyKSwgbGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiLCBheGlzLnRpdGxlLnggPSBlbGVtZW50X2JsYW5rKCksIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfYmxhbmsoKSkpCgojIEJveHBsb3RzIGJ5IEJFQSByZWdpb24KcGxvdDNiIDwtIChnZ3Bsb3QoaW5zdXJhbmNlXzIwMTUsIGFlcyh4ID0gcmVvcmRlcihCRUFfcmVnaW9uLCBpbnN1cmVkX3BjdF8yMDE1KSwgeSA9IGluc3VyZWRfcGN0XzIwMTUpKSAKICAgICAgICAgICsgZ2VvbV9ib3hwbG90KGFlcyhmaWxsID0gQkVBX3JlZ2lvbiwgbGFiZWwgPSBpbnN1cmVkX3BjdF8yMDE1KSwgY29sb3IgPSAiZ3JheTMwIikKICAgICAgICAgICsgY29vcmRfZmxpcCgpCiAgICAgICAgICArIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGJyZXdlci5wYWwobiA9IDgsIG5hbWUgPSAiRGFyazIiKSkKICAgICAgICAgICsgZ2d0aXRsZSgiQnkgQnVyZWF1IG9mIEVjb25vbWljIEFuYWx5c2lzIChCRUEpIFJlZ2lvbiIpCiAgICAgICAgICArIHRoZW1lX21pbmltYWwoKQogICAgICAgICAgKyB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGZhY2U9ImJvbGQiLCBoanVzdCA9IDAuMjQsIHNpemUgPSAxMiksIGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiwgYXhpcy50aXRsZS54ID0gZWxlbWVudF9ibGFuaygpLCBheGlzLnRpdGxlLnkgPSBlbGVtZW50X2JsYW5rKCkpKQoKIyBCb3hwbG90cyBieSBpbmNvbWUgbGV2ZWwKcGxvdDNjIDwtIChnZ3Bsb3QoaW5zdXJhbmNlXzIwMTUsIGFlcyh4ID0gaW5jb21lX2xldmVsLCB5ID0gaW5zdXJlZF9wY3RfMjAxNSkpIAogICAgICAgICAgKyBnZW9tX2JveHBsb3QoYWVzKGZpbGwgPSBpbmNvbWVfbGV2ZWwsIGxhYmVsID0gaW5zdXJlZF9wY3RfMjAxNSksIGNvbG9yID0gImdyYXkzMCIpCiAgICAgICAgICArIGNvb3JkX2ZsaXAoKQogICAgICAgICAgKyBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBicmV3ZXIucGFsKG4gPSA0LCBuYW1lID0gIkRhcmsyIikpCiAgICAgICAgICArIGxhYnMoeCA9ICIiLCB5ID0gIiUgSW5zdXJlZCAoMjAxNSkiKQogICAgICAgICAgKyBnZ3RpdGxlKCJCeSBTdGF0ZSdzIEluY29tZSBMZXZlbCIpCiAgICAgICAgICArIHRoZW1lX21pbmltYWwoKQogICAgICAgICAgKyB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGZhY2U9ImJvbGQiLCBoanVzdCA9IDAuMzksIHNpemUgPSAxMiksIGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiwgYXhpcy50aXRsZS55ID0gZWxlbWVudF9ibGFuaygpKSkKCiMgQ29tYmluZSBwbG90cyB2ZXJ0aWNhbGx5CmdyaWQuYXJyYW5nZShwbG90M2EsIHBsb3QzYiwgcGxvdDNjLCBucm93ID0gMywgdG9wID0gIjIwMTUgSW5zdXJhbmNlIFJhdGVzIGF0IGEgR2xhbmNlIikKYGBgCgoKCmBgYHtyLCBldmFsID0gVFJVRSwgZWNobyA9IEZBTFNFLCB3YXJuaW5nID0gRkFMU0UsIHRpZHkgPSBUUlVFfQojIyBTT01FIERBVEEgUkVTSEFQSU5HCgojIFJlc2hhcGUgYWNhX2dlbmVyYWwgKGxvbmcpLCBrZWVwaW5nIHRoZSBpbnRlcmVzdGluZyBxdWFudGl0aWVzCiAgIyBJbXBvcnQgdW5pbnN1cmVkIG51bWJlciAoMjAxNSkKYWNhX2dlbmVyYWwkdW5pbnNfYWxsXzE1IDwtIGluc3VyYW5jZSR1bmluc3VyZWRfbnVtXzIwMTVbbWF0Y2goYWNhX2dlbmVyYWwkc3RhdGUsIGluc3VyYW5jZSRzdGF0ZSldCiAgIyBLZWVwIG9ubHkgc2VsZWN0IHZhcmlhYmxlcwphY2FfZ2VuZXJhbF9sb25nIDwtIGFjYV9nZW5lcmFsWyAsIGMoInN0YXRlIiwgInN0YXRlX2FiYiIsICJjb3ZfZW1wIiwgImNvdl9ta3RfcGxhbl8xNiIsICJtZWRpY2FpZF9lbnJvbGxfMTYiLCAibWVkaWNhcmVfZW5yb2xsXzE2IiwgInVuaW5zX2FsbF8xNSIpXQogICMgVGhlIGFjdHVhbCByZXNoYXBpbmcKYWNhX2dlbmVyYWxfbG9uZyA8LSByZXNoYXBlKGFjYV9nZW5lcmFsX2xvbmcsIAogICAgICAgICAgICAgICAgICAgICAgdmFyeWluZyA9IGMoImNvdl9lbXAiLCAiY292X21rdF9wbGFuXzE2IiwgIm1lZGljYWlkX2Vucm9sbF8xNiIsICJtZWRpY2FyZV9lbnJvbGxfMTYiLCAidW5pbnNfYWxsXzE1IiksCiAgICAgICAgICAgICAgICAgICAgICB2Lm5hbWVzID0gIk51bWJlciIsCiAgICAgICAgICAgICAgICAgICAgICB0aW1ldmFyID0gIlNvdXJjZSIsCiAgICAgICAgICAgICAgICAgICAgICB0aW1lcyA9IGMoIkVtcGxveWVyIiwgIk1hcmtldHBsYWNlIiwgIk1lZGljYWlkIC8gQ0hJUCIsICJNZWRpY2FyZSIsICJVbmluc3VyZWQiKSwKICAgICAgICAgICAgICAgICAgICAgIG5ldy5yb3cubmFtZXMgPSAxOjEwMDAsCiAgICAgICAgICAgICAgICAgICAgICBkaXJlY3Rpb24gPSAibG9uZyIpCgojIExvb2stdXAgaW5mb3JtYXRpb24gaW50byBhY2FfZ2VuZXJhbF9sb25nLCBvbjoKICAjIFBhcnR5ICgyMDEyKQphY2FfZ2VuZXJhbF9sb25nJHBhcnR5XzIwMTIgPC0gZWxlY3Rpb24kcGFydHlfMjAxMlttYXRjaChhY2FfZ2VuZXJhbF9sb25nJHN0YXRlLCBlbGVjdGlvbiRzdGF0ZSldCiAgIyBCRUEgcmVnaW9uCmFjYV9nZW5lcmFsX2xvbmckQkVBX3JlZ2lvbiA8LSBkZW1vZ3JhcGhpY3MxJEJFQV9yZWdpb25bbWF0Y2goYWNhX2dlbmVyYWxfbG9uZyRzdGF0ZSwgZGVtb2dyYXBoaWNzMSRzdGF0ZSldCiAgIyBJbmNvbWUgbGV2ZWwKYWNhX2dlbmVyYWxfbG9uZyRpbmNvbWVfbGV2ZWwgPC0gZGVtb2dyYXBoaWNzMSRpbmNvbWVfbGV2ZWxbbWF0Y2goYWNhX2dlbmVyYWxfbG9uZyRzdGF0ZSwgZGVtb2dyYXBoaWNzMSRzdGF0ZSldCiAgIyBQb3B1bGF0aW9uCmFjYV9nZW5lcmFsX2xvbmckcG9wdWxhdGlvbl8yMDE1IDwtIGRlbW9ncmFwaGljczIkcG9wdWxhdGlvbl8yMDE1W21hdGNoKGFjYV9nZW5lcmFsX2xvbmckc3RhdGUsIGRlbW9ncmFwaGljczIkc3RhdGUpXQoKIyBDYWxjdWxhdGUgcGVyY2VudGFnZSBmcm9tIG51bWJlciBhbmQgcG9wdWxhdGlvbgphY2FfZ2VuZXJhbF9sb25nJHBlcmNlbnRhZ2UgPC0gYWNhX2dlbmVyYWxfbG9uZyROdW1iZXIgLyBhY2FfZ2VuZXJhbF9sb25nJHBvcHVsYXRpb25fMjAxNSAqIDEwMApgYGAKICAKICAKX19GaWd1cmUgNV9fCgpOZXh0LCB3ZSBpbnZlc3RpZ2F0ZSB0aGUgbWFpbiBoZWFsdGggaW5zdXJhbmNlIGFuZCBjb3ZlcmFnZSBzb3VyY2VzLCBuYW1lbHkgZW1wbG95ZXIgY292ZXJhZ2UsIHRoZSBpbmRpdmlkdWFsIG1hcmtldHBsYWNlLCBNZWRpY2FpZCAvIENoaWxkcmVucycgSGVhbHRoIEluc3VyYW5jZSBQcm9ncmFtIChDSElQKSwgYW5kIE1lZGljYXJlIGZvciB0aGUgYWdlZC4gV2UgYnJva2UgZG93biB0aGUgcmVzdWx0cyBieSBwYXJ0eSBhbmQgaW5jb21lIGxldmVsLCB0YWtpbmcgYSBzaW1wbGUgKHVud2VpZ2h0ZWQpIGF2ZXJhZ2UgYWNyb3NzIHRoZSBzdGF0ZXMgaW4gdGhlIGNhdGVnb3JpZXMuIFdlIG9ic2VydmUgdGhhdCBlbXBsb3llciBjb3ZlcmFnZSByYXRlcyBpbmNyZWFzZSBhcyBpbmNvbWUgbGV2ZWwgaW5jcmVhc2VzLCBlc3BlY2lhbGx5IGZvciBEZW1vY3JhdGljIHN0YXRlcy4gRGVtb2NyYXRpYyBhbmQgbG93IGluY29tZSBzdGF0ZXMgaGF2ZSBtb3JlIHBlb3BsZSBvbiBNZWRpY2FpZCAvIENISVAgdGhhbiBSZXB1YmxpY2FuIGFuZCBsb3cgaW5jb21lIHN0YXRlcy4KCmBgYHtyLCBldmFsID0gVFJVRSwgZWNobyA9IEZBTFNFLCB3YXJuaW5nID0gRkFMU0UsIHRpZHkgPSBUUlVFfQojIyBQTE9UIDUKCmFjYV9nZW5lcmFsX2xvbmdfYnlfcGFydHlfaW5jb21lIDwtIGRkcGx5KGFjYV9nZW5lcmFsX2xvbmcsIGMoInBhcnR5XzIwMTIiLCAiaW5jb21lX2xldmVsIiwgIlNvdXJjZSIpLCBzdW1tYXJpc2UsIGF2Z19wY3QgPSBtZWFuKHBlcmNlbnRhZ2UpKQoKcGxvdDQgPC0gKGdncGxvdChhY2FfZ2VuZXJhbF9sb25nX2J5X3BhcnR5X2luY29tZSwgYWVzKGluY29tZV9sZXZlbCwgYXZnX3BjdCwgZmlsbCA9IFNvdXJjZSkpCiAgICAgICAgICArIGdlb21fY29sKHBvc2l0aW9uID0gImRvZGdlIikgKyBmYWNldF9ncmlkKHBhcnR5XzIwMTIgfiAuKQogICAgICAgICAgKyBsYWJzKHggPSAiSW5jb21lIExldmVsIiwgeSA9ICJBdmVyYWdlICUgaW4gU3RhdGUiLCBjb2xvciA9ICJTb3VyY2Ugb2YgXG5JbnN1cmFuY2UiKQogICAgICAgICAgKyBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBicmV3ZXIucGFsKG4gPSA2LCBuYW1lID0gIkRhcmsyIilbYygxOjMsNiw0KV0pCiAgICAgICAgICArIGdndGl0bGUoIlNvdXJjZXMgb2YgSGVhbHRoIEluc3VyYW5jZSwgXG5ieSBQYXJ0eSBhbmQgSW5jb21lIExldmVsIikKICAgICAgICAgICsgdGhlbWVfbWluaW1hbCgpCiAgICAgICAgICArIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoZmFjZT0iYm9sZCIsIGhqdXN0ID0gMCwgc2l6ZSA9IDEyKSkpCmdncGxvdGx5KHBsb3Q0LCB0b29sdGlwID0gYygiaW5jb21lX2xldmVsIiwgIlNvdXJjZSIsICJhdmdfcGN0IikpCmBgYAoKCmBgYHtyLCBldmFsID0gVFJVRSwgZWNobyA9IEZBTFNFLCB3YXJuaW5nID0gRkFMU0UsIHRpZHkgPSBUUlVFfQojIyBQUkVQQVJBVElPTiBGT1IgRlVSVEhFUiBQTE9UUyAoSU5DTFVESU5HIERBVEEgVEFCTEUpCgojIFdhbnQgdG8gY29tYmluZSBpbmZvcm1hdGlvbiBvbiBpbnN1cmFuY2UgY292ZXJhZ2Ugd2l0aCBrZXkgaW5mb3JtYXRpb24gb24gaGVhbHRoIG91dGNvbWVzL2FjY2VzcyBhbmQgYWZmb3JkYWJpbGl0eQoKa2V5X2luZGljYXRvcnMgPC0gc3RhdGVfYWJiX2xvb2t1cAoKIyMgTWVyZ2UgaW4gaW5mb3JtYXRpb24gdG8gdGhlIGRhdGEgdGFibGUgb24gdGhlIGZvbGxvd2luZwoKIyBEZW1vZ3JhcGhpYyBJbmZvcm1hdGlvbgogICMgSW5jb21lIGxldmVsCmtleV9pbmRpY2F0b3JzJGluY29tZV9sZXZlbCA8LSBkZW1vZ3JhcGhpY3MxJGluY29tZV9sZXZlbFttYXRjaChrZXlfaW5kaWNhdG9ycyRzdGF0ZV9hYmIsIGRlbW9ncmFwaGljczEkc3RhdGVfYWJiKV0KCiMgSW5zdXJhbmNlIENvdmVyYWdlCiAgIyBQZXJjZW50YWdlIGluc3VyZWQgKDIwMTUpCmtleV9pbmRpY2F0b3JzJGluc3VyZWRfcGN0XzIwMTUgPC0gaW5zdXJhbmNlJGluc3VyZWRfcGN0XzIwMTVbbWF0Y2goa2V5X2luZGljYXRvcnMkc3RhdGVfYWJiLCBpbnN1cmFuY2Ukc3RhdGVfYWJiKV0KICAjIFBlcmNlbnRhZ2UgaW5zdXJlZCAoMjAxNCkKa2V5X2luZGljYXRvcnMkaW5zdXJlZF9wY3RfMjAxNCA8LSBpbnN1cmFuY2UkaW5zdXJlZF9wY3RfMjAxNFttYXRjaChrZXlfaW5kaWNhdG9ycyRzdGF0ZV9hYmIsIGluc3VyYW5jZSRzdGF0ZV9hYmIpXQogICMgSW5kaWNhdG9yOiBXaGV0aGVyIHN0YXRlIGhhcyBleHBhbmRlZCBtZWRpY2FyZQprZXlfaW5kaWNhdG9ycyRzdGF0ZV9oYXNfZXhwYW5kZWQgPC0gYWNhX2dlbmVyYWwkc3RhdGVfaGFzX2V4cGFuZGVkW21hdGNoKGtleV9pbmRpY2F0b3JzJHN0YXRlX2FiYiwgYWNhX2dlbmVyYWwkc3RhdGVfYWJiKV0KCiMgSGVhbHRoIG91dGNvbWVzIGFuZCBhY2Nlc3MKICAjIE1vcnRhbGl0eSBhbWVuYWJsZSB0byBoZWFsdGggY2FyZSwgZGVhdGhzIHBlciAxMDAwMCBwb3B1bGF0aW9uCmtleV9pbmRpY2F0b3JzJGRlYXRoc19hbWVuYWJsZV8yMDE0IDwtIGhlYWx0aF9pbmQkaC5kZWF0aHNfYW1lbmFibGUuMjAxNCBbbWF0Y2goa2V5X2luZGljYXRvcnMkc3RhdGVfYWJiLCBoZWFsdGhfaW5kJHN0YXRlX2FiYildCiAgIyBZZWFycyBvZiBQb3RlbnRpYWwgTGlmZSBMb3N0IGJlZm9yZSA3NQprZXlfaW5kaWNhdG9ycyR5ZWFyc19saWZlX2xvc3QgPC0gaGVhbHRoX2luZCRoLnlyc19sb3N0X3BvdGVudGlhbF9saWZlX2JlZm9yZTc1LjIwMTQgW21hdGNoKGtleV9pbmRpY2F0b3JzJHN0YXRlX2FiYiwgaGVhbHRoX2luZCRzdGF0ZV9hYmIpXQogICMgQWR1bHRzIHdpdGggYSB1c3VhbCBzb3VyY2Ugb2YgY2FyZSAoJSkKa2V5X2luZGljYXRvcnMkdXN1YWxfY2FyZV8yMDE1IDwtIGhlYWx0aF9pbmQkcS53aXRoX3VzdWFsX2NhcmVfYWR1bHQuMjAxNSBbbWF0Y2goa2V5X2luZGljYXRvcnMkc3RhdGVfYWJiLCBoZWFsdGhfaW5kJHN0YXRlX2FiYildCiAgIyBBZHVsdHMgd2l0aCBhZ2UvZ2VuZGVyLWFwcHJvcHJpYXRlIGNhbmNlciBzY3JlZW5pbmdzICglKQprZXlfaW5kaWNhdG9ycyR3aXRoX2NhbmNlcl9zY3JlZW5pbmcgPC0gaGVhbHRoX2luZCRxLndpdGhfY2FuY2VyX3NjcmVlbmluZ19hZHVsdC4yMDE0IFttYXRjaChrZXlfaW5kaWNhdG9ycyRzdGF0ZV9hYmIsIGhlYWx0aF9pbmQkc3RhdGVfYWJiKV0KICAjIEFkdWx0cyB3aXRoIGFnZS1hcHByb3ByaWF0ZSB2YWNjaW5lcyAoJSkKa2V5X2luZGljYXRvcnMkd2l0aF92YWNjaW5lcyA8LSBoZWFsdGhfaW5kJHEud2l0aF92YWNjaW5lc19hZHVsdC4yMDE1IFttYXRjaChrZXlfaW5kaWNhdG9ycyRzdGF0ZV9hYmIsIGhlYWx0aF9pbmQkc3RhdGVfYWJiKV0KCiMgQWZmb3JkYWJpbGl0eSBhbmQgY29zdC1lZmZpY2llbmN5CiAgIyBJbmRpdmlkdWFscyB1bmRlciBhZ2UgNjUgd2l0aCBoaWdoIE9PUCBtZWRpY2FsIGNvc3RzIHJlbGF0aXZlIHRvIGFubnVhbCBob3VzZWhvbGQgaW5jb21lCmtleV9pbmRpY2F0b3JzJGhpZ2hfT09QX3JlbGF0aXZlIDwtIGhlYWx0aF9pbmQkYS5oaWdoX09PUF9yZWxhdGl2ZV91bmRlcjY1LjIwMTUgW21hdGNoKGtleV9pbmRpY2F0b3JzJHN0YXRlX2FiYiwgaGVhbHRoX2luZCRzdGF0ZV9hYmIpXQogICMgQXZlcmFnZSBhbm51YWwgZ3Jvd3RoIGluIGZhbWlseSBwcmVtaXVtcyBmb3IgZW1wbG95ZXIgY292ZXJhZ2UgKGJldHdlZW4gMjAxMCBhbmQgMjAxNSkKa2V5X2luZGljYXRvcnMkcHJlbWl1bV9hbm5fZ3Jvd3RoXzEwXzE1IDwtIGFjYV9nZW5lcmFsJHByZW1pdW1fZW1wX2F2Z19ncm93dGhfcGN0XzEwdG8xNVttYXRjaChrZXlfaW5kaWNhdG9ycyRzdGF0ZV9hYmIsIGFjYV9nZW5lcmFsJHN0YXRlX2FiYildCiAgIyBNYXJrZXRwbGFjZSBjb25zdW1lcnMgd2hvIGNvdWxkIHNlbGVjdCBhIHBsYW4gZm9yIGxlc3MgdGhhbiAkMTAwCmtleV9pbmRpY2F0b3JzJElNX3BsYW5fdW5kZXJfMTAwIDwtIGFjYV9nZW5lcmFsJGNvdl9ta3RfdW5kZXIxMDBEX3BjdFttYXRjaChrZXlfaW5kaWNhdG9ycyRzdGF0ZV9hYmIsIGFjYV9nZW5lcmFsJHN0YXRlX2FiYildCiAgIyBOZXQgaW5jcmVhc2UgaW4gZmVkZXJhbCBzcGVuZGluZyAobWlsbGlvbnMpCmtleV9pbmRpY2F0b3JzJGluY3JfZmVkX3NwZW5kaW5nX21pbCA8LSBhY2FfZ2VuZXJhbCRmZWRfc3BlbmRpbmdfbmV0X2luY3JfaW5NaWxbbWF0Y2goa2V5X2luZGljYXRvcnMkc3RhdGVfYWJiLCBhY2FfZ2VuZXJhbCRzdGF0ZV9hYmIpXQpgYGAKCiAgCiMgKDIpIEhlYWx0aCBPdXRjb21lcyBhbmQgQWNjZXNzCgpfX0ZpZ3VyZSA2X18KCk5leHQsIHdlIGFyZSBpbnRlcmVzdGVkIHRvIGZpbmQgb3V0IGhvdyBoZWFsdGggaW5zdXJhbmNlIHJhdGVzIGNvcnJlbGF0ZXMgd2l0aCBoZWFsdGggb3V0Y29tZXMuIEluIHBhcnRpY3VsYXIsIHdlIGNhbiBsb29rIGF0IHRoZSBtZWFzdXJlIG9mIG1vcnRhbGl0eSBhbWVuYWJsZSB0byBoZWFsdGhjYXJlIGludGVydmVudGlvbiAtIHRoZSBudW1iZXIgb2YgZGVhdGhzIHRoYXQgY291bGQgaGF2ZSBiZWVuIHByZXZlbnRlZCBieSBoZWFsdGhjYXJlIGluIHRoZSB5ZWFyIDIwMTQuIFdlIHBsb3QgYXZvaWRhYmxlIG1vcnRhbGl0eSAoMjAxNCkgYWdhaW5zdCBpbnN1cmFuY2UgcmF0ZXMgKDIwMTQpIGFuZCBvYnNlcnZlIGEgbmVnYXRpdmUgcmVsYXRpb25zaGlwIGFzIGV4cGVjdGVkLiBTdGF0ZXMgdGhhdCBoYXZlIGhpZ2hlciByYXRlcyBvZiBpbnN1cmFuY2UgYWxzbyBoYXZlIGJldHRlciBoZWFsdGggaW4gdGhpcyByZXNwZWN0LiBIb3dldmVyLCB3ZSBhbHNvIGNvbnRyb2wgZm9yIGluY29tZSBsZXZlbHMgYXMgbG93IGluY29tZSBsZXZlbHMgd291bGQgYmUgYSBtYWpvciBwcmVkaWN0b3Igb2YgcG9vciBoZWFsdGgsIGFzIGNvbmZpcm1lZCBpbiBvdXIgcGxvdC4gWWV0LCB3aXRoaW4gZWFjaCBpbmNvbWUgbGV2ZWwsIHRoZSBuZWdhdGl2ZSByZWxhdGlvbnNoaXAgcmVtYWlucywgYW5kIGl0IGlzIGVzcGVjaWFsbHkgcHJvbm91bmNlZCBhbW9uZyB0aGUgdXBwZXItbWlkZGxlIGluY29tZSBjb3VudHJpZXMuIAoKYGBge3IsIGV2YWwgPSBUUlVFLCBlY2hvID0gRkFMU0UsIHdhcm5pbmcgPSBGQUxTRSwgdGlkeSA9IFRSVUV9CiMjIFBMT1QgNgpwbG90NSA8LSAoZ2dwbG90KGtleV9pbmRpY2F0b3JzLCBhZXMoaW5zdXJlZF9wY3RfMjAxNCwgZGVhdGhzX2FtZW5hYmxlXzIwMTQpKQogICAgICAgICAgKyBnZW9tX3BvaW50KGFlcyhjb2xvciA9IGluY29tZV9sZXZlbCwgc2hhcGUgPSBzdGF0ZV9oYXNfZXhwYW5kZWQpLCBzaXplID0gMikKICAgICAgICAgICsgZ2VvbV9zbW9vdGgoYWVzKGNvbG9yID0gaW5jb21lX2xldmVsLCBncm91cCA9IGluY29tZV9sZXZlbCksIG1ldGhvZCA9ICJsbSIsIGx3ZCA9IDEsIHNlID0gRkFMU0UpCiAgICAgICAgICArIGdlb21fc21vb3RoKGNvbG9yID0gImJsYWNrIiwgbWV0aG9kID0gImxtIiwgbGluZXR5cGUgPSAyLCBsd2QgPSAxLCBzZSA9IEZBTFNFKQogICAgICAgICAgKyBsYWJzKHggPSAiJSBJbnN1cmVkIiwgeSA9ICJEZWF0aHMgUHJldmVudGFibGUgYnkgSGVhbHRoY2FyZSBJbnRlcnZlbnRpb24gXG4ocGVyIDEwMCwwMDAgUGVvcGxlKSIsIGNvbG9yID0gIkluY29tZSBcbkxldmVsIiwgc2hhcGUgPSAiU3RhdGUgaGFzIFxuRXhwYW5kZWQgXG5NZWRpY2FpZCIpCiAgICAgICAgICArIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBicmV3ZXIucGFsKG4gPSA0LCBuYW1lID0gIkRhcmsyIikpCiAgICAgICAgICArIGdndGl0bGUoIlJlbGF0aW9uc2hpcCBCZXR3ZWVuIEF2b2lkYWJsZSBNb3J0YWxpdHkgYW5kIFxuSGVhbHRoIEluc3VyYW5jZSBDb3ZlcmFnZSBBbW9uZyBTdGF0ZXMiKQogICAgICAgICAgKyB0aGVtZV9taW5pbWFsKCkKICAgICAgICAgICsgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChmYWNlPSJib2xkIiwgaGp1c3QgPSAwLjUsIHNpemUgPSAxMikpKQpwbG90NQpgYGAKCgpgYGB7ciwgZXZhbCA9IFRSVUUsIGVjaG8gPSBGQUxTRSwgd2FybmluZyA9IEZBTFNFLCB0aWR5ID0gVFJVRX0KIyMgREFUQSBQUk9DRVNTSU5HIEZPUiBNQVBTCgojIE9idGFpbiBzaGFwZSBmaWxlcyBvZiBVUyBzdGF0ZXMKbWFwX3N0YXRlcyA9IG1hcCgic3RhdGUiLCBmaWxsID0gVFJVRSwgcGxvdCA9IEZBTFNFKQoKIyBTdGFuZGFyZGl6ZSBuYW1lIGZvcm1hdCB3aXRoIHJlc3Qgb2YgYXNzaWdubWVudAogICMgRnVuY3Rpb24gdG8gY29udmVyIHRvIHByb3BlciBjYXNlCnByb3BlckNhc2UgPC0gZnVuY3Rpb24oeCkgewogIHMgPC0gc3Ryc3BsaXQoeCwgIiAiKVtbMV1dCiAgcGFzdGUodG91cHBlcihzdWJzdHJpbmcocywgMSwxKSksIHN1YnN0cmluZyhzLCAyKSwKICAgICAgc2VwPSIiLCBjb2xsYXBzZT0iICIpCn0KICAjIENvbnZlcnQgdG8gcHJvcGVyIGNhc2UKbWFwX3N0YXRlcyRzdGF0ZSA8LSBzYXBwbHkobWFwX3N0YXRlcyRuYW1lcywgcHJvcGVyQ2FzZSkKICAjIFJlbmFtZSB0aGUgbWFpbiBjb21wb25lbnQgb2Ygc3RhdGVzIHdpdGggbXVsdGlwbGUgcGFydHMgaW4gdGhlIG1hcAptYXBfc3RhdGVzJHN0YXRlW21hcF9zdGF0ZXMkc3RhdGUgPT0gIk1hc3NhY2h1c2V0dHM6bWFpbiJdIDwtICJNYXNzYWNodXNldHRzIgptYXBfc3RhdGVzJHN0YXRlW21hcF9zdGF0ZXMkc3RhdGUgPT0gIk1pY2hpZ2FuOnNvdXRoIl0gPC0gIk1pY2hpZ2FuIgptYXBfc3RhdGVzJHN0YXRlW21hcF9zdGF0ZXMkc3RhdGUgPT0gIk5ldyBZb3JrOm1haW4iXSA8LSAiTmV3IFlvcmsiCm1hcF9zdGF0ZXMkc3RhdGVbbWFwX3N0YXRlcyRzdGF0ZSA9PSAiTm9ydGggQ2Fyb2xpbmE6bWFpbiJdIDwtICJOb3J0aCBDYXJvbGluYSIKbWFwX3N0YXRlcyRzdGF0ZVttYXBfc3RhdGVzJHN0YXRlID09ICJWaXJnaW5pYTptYWluIl0gPC0gIlZpcmdpbmlhIgptYXBfc3RhdGVzJHN0YXRlW21hcF9zdGF0ZXMkc3RhdGUgPT0gIldhc2hpbmd0b246bWFpbiJdIDwtICJXYXNoaW5ndG9uIgogICMgTWF0Y2ggd2l0aCBzdGF0ZSBhYmJyZXZpYXRpb25zCm1hcF9zdGF0ZXMkc3RhdGVfYWJiIDwtIHN0YXRlX2FiYl9sb29rdXAkc3RhdGVfYWJiW21hdGNoKG1hcF9zdGF0ZXMkc3RhdGUsIHN0YXRlX2FiYl9sb29rdXAkc3RhdGUpXQogICMgVGhlbiBzdHJpcCBvZmYgYWxsIHRoZSBleHRyYSBsb2NhdGlvbiBpbmZvcm1hdGlvbiBmb3Igc3RhdGVzIHdpdGggbXVsdGlwbGUgcGFydHMgKGxlYXZpbmcganVzdCB0aGUgc3RhdGUgbmFtZSkKZm9yIChpIGluIDE6bGVuZ3RoKG1hcF9zdGF0ZXMkc3RhdGUpKSB7CiAgbWFwX3N0YXRlcyRzdGF0ZVtpXSA8LSB1bmxpc3Qoc3Ryc3BsaXQobWFwX3N0YXRlcyRzdGF0ZVtpXSwgIjoiKSlbMV0KfQoKIyBHZXQgY29vcmRpbmF0ZXMgb2Ygc3RhdGUgY2VudGVycwpzdGF0ZXNfY2VudGVycyA8LSBzdGF0ZS5jZW50ZXIKc3RhdGUuY2VudGVyIDwtIGNiaW5kKHN0YXRlc19jZW50ZXJzLCBzdGF0ZV9hYmJfbG9va3VwKQoKIyBIZWFsdGggb3V0Y29tZXM6IEltcG9ydCBrZXkgaW5kaWNhdG9ycyBkYXRhLCBtYXRjaGVkIGJ5IHN0YXRlCiAgICAjIFJlbWVtYmVyIHRvIGxhdGVyIG1hdGNoIGluZm9ybWF0aW9uIGJhc2VkIG9uIHN0YXRlLCBub3Qgc3RhdGUgYWJicmV2aWF0aW9uIChkdWUgdG8gaG93IHdlIGxhYmVsbGVkIGFib3ZlKQptYXBfc3RhdGVzJGRlYXRoc19hbWVuYWJsZV8yMDE0IDwtIGtleV9pbmRpY2F0b3JzJGRlYXRoc19hbWVuYWJsZV8yMDE0W21hdGNoKG1hcF9zdGF0ZXMkc3RhdGUsIGtleV9pbmRpY2F0b3JzJHN0YXRlKV0KbWFwX3N0YXRlcyR1c3VhbF9jYXJlXzIwMTUgPC0ga2V5X2luZGljYXRvcnMkdXN1YWxfY2FyZV8yMDE1W21hdGNoKG1hcF9zdGF0ZXMkc3RhdGUsIGtleV9pbmRpY2F0b3JzJHN0YXRlKV0KbWFwX3N0YXRlcyR3aXRoX2NhbmNlcl9zY3JlZW5pbmcgPC0ga2V5X2luZGljYXRvcnMkd2l0aF9jYW5jZXJfc2NyZWVuaW5nW21hdGNoKG1hcF9zdGF0ZXMkc3RhdGUsIGtleV9pbmRpY2F0b3JzJHN0YXRlKV0KbWFwX3N0YXRlcyR3aXRoX3ZhY2NpbmVzIDwtIGtleV9pbmRpY2F0b3JzJHdpdGhfdmFjY2luZXNbbWF0Y2gobWFwX3N0YXRlcyRzdGF0ZSwga2V5X2luZGljYXRvcnMkc3RhdGUpXQoKIyBDb3N0IG91dGNvbWVzOiBJbXBvcnQga2V5IGluZGljYXRvcnMgZGF0YSwgbWF0Y2hlZCBieSBzdGF0ZQogICAgIyBSZW1lbWJlciB0byBsYXRlciBtYXRjaCBpbmZvcm1hdGlvbiBiYXNlZCBvbiBzdGF0ZSwgbm90IHN0YXRlIGFiYnJldmlhdGlvbiAoZHVlIHRvIGhvdyB3ZSBsYWJlbGxlZCBhYm92ZSkKbWFwX3N0YXRlcyRoaWdoX09PUF9yZWxhdGl2ZSA8LSBrZXlfaW5kaWNhdG9ycyRoaWdoX09PUF9yZWxhdGl2ZVttYXRjaChtYXBfc3RhdGVzJHN0YXRlLCBrZXlfaW5kaWNhdG9ycyRzdGF0ZSldCm1hcF9zdGF0ZXMkcHJlbWl1bV9hbm5fZ3Jvd3RoXzEwXzE1IDwtIGtleV9pbmRpY2F0b3JzJHByZW1pdW1fYW5uX2dyb3d0aF8xMF8xNVttYXRjaChtYXBfc3RhdGVzJHN0YXRlLCBrZXlfaW5kaWNhdG9ycyRzdGF0ZSldCm1hcF9zdGF0ZXMkSU1fcGxhbl91bmRlcl8xMDAgPC0ga2V5X2luZGljYXRvcnMkSU1fcGxhbl91bmRlcl8xMDBbbWF0Y2gobWFwX3N0YXRlcyRzdGF0ZSwga2V5X2luZGljYXRvcnMkc3RhdGUpXQptYXBfc3RhdGVzJGluY3JfZmVkX3NwZW5kaW5nX21pbCA8LSBrZXlfaW5kaWNhdG9ycyRpbmNyX2ZlZF9zcGVuZGluZ19taWxbbWF0Y2gobWFwX3N0YXRlcyRzdGF0ZSwga2V5X2luZGljYXRvcnMkc3RhdGUpXQpgYGAKCgpfX0ZpZ3VyZSA3X18KClRoZSBmb2xsb3dpbmcgbWFwcyBob3cgdGhlIHN0YXRlcyBwZXJmb3JtZWQgaW4gdmFyaW91cyBoZWFsdGggb3V0Y29tZXMsIG5hbWVseSBwcmV2ZW50YWJsZSBtb3J0YWxpdHksIGFjY2VzcyB0byBhIHVzdWFsIHNvdXJjZSBvZiBjYXJlLCByYXRlIG9mIGFnZS1hcHByb3ByaWF0ZSBjYW5jZXIgc2NyZWVuaW5ncyBpbiBhZHVsdHMsIGFuZCByYXRlIG9mIGFnZS1hcHByb3ByaWF0ZSB2YWNjaW5hdGlvbnMgaW4gYWR1bHRzLiBBIGdyZWVuIGNvbG9yIGluY2lkYXRlcyBhIGNvbXBhcmF0aXZlbHkgbW9yZSBmYXZvcmFibGUgb3V0Y29tZSwgd2hpbGUgYSByZWQgY29sb3IgaW5kaWNhdGVzIGEgbGVzcyBmYXZvcmFibGUgb3V0Y29tZS4KCldlIG5vdGUgdGhhdCB0aGUgTm9ydGhlYXN0IChOZXcgRW5nbGFuZCkgc3RhdGVzIHBlcmZvcm0gY29uc2lzdGVudGx5IHdlbGwgYWNyb3NzIGFsbCBoZWFsdGggb3V0Y29tZXMsIHdoaWxlIHRoZSBTb3V0aGVhc3Qgc3RhdGVzLCBhcyB3ZWxsIGFzIFRleGVzLCBwZWZvcm0gY29uc2lzdGVudGx5IHBvb3JseSBvbiBhbGwgZXhjZXB0IGZvciB2YWNjaW5hdGlvbiByYXRlcy4gVGhlIFdlc3Rlcm4gYW5kIFJvY2t5IE1vdW50YWlucyBzdGF0ZXMgaGF2ZSBhIGxvdyBhdm9pZGFibGUgbW9ydGFsaXR5IHJhdGUsIGRlc3BpdGUgaGF2aW5nIGxvdyByYXRlcyBvZiBhY2Nlc3MgdG8gdXN1YWwgY2FyZSBhbmQgb2YgY2FuY2VyIHNjcmVlbmluZyBhbmQgdmFjY2luYXRpb25zLiBJbiB0aGUgbWVhc3VyZSBvZiBhZHVsdCB2YWNjaW5hdGlvbiByYXRlcywgdGhlIHRyZW5kIG9mIHRoZSBTb3V0aCBmYXJpbmcgcG9vcmVyIG9uIGhlYWx0aCBpcyByZXZlcnNlZCwgYXMgdGhleSBkbyBjb21wYXJhdGl2ZWx5IHdlbGwgaW4gdmFjY2luYXRpb25zLgogIAoKYGBge3IsIGV2YWwgPSBUUlVFLCBlY2hvID0gRkFMU0UsIHdhcm5pbmcgPSBGQUxTRSwgdGlkeSA9IFRSVUV9CiMjIFBMT1QgNzogTEVBRkxFVCBNQVAgLSBIRUFMVEggT1VUQ09NRVMKCihsZWFmbGV0KG1hcF9zdGF0ZXMpICU+JSAKICAgIHNldFZpZXcobGF0PTM5LjgyODIsIGxuZz0tOTYgLCB6b29tPTQpICU+JQogICAgYWRkUG9seWdvbnMoY29sb3IgPSAiIzMzMzMzMyIsIHdlaWdodCA9IDEsIHNtb290aEZhY3RvciA9IDAuNSwgZmlsbE9wYWNpdHkgPSAwKSAlPiUKICAgIGFkZFBvbHlnb25zKGdyb3VwID0gIlByZXZlbnRhYmxlIERlYXRocyIsIGZpbGxDb2xvciA9IH5jb2xvclF1YW50aWxlKCJSZFlsR24iLCAtZGVhdGhzX2FtZW5hYmxlXzIwMTQpKC1kZWF0aHNfYW1lbmFibGVfMjAxNCksIHNtb290aEZhY3RvciA9IDAuNSwgc3Ryb2tlID0gRkFMU0UsIGZpbGxPcGFjaXR5ID0gMC42LCBwb3B1cCA9IHBhc3RlKCI8Yj5TdGF0ZTogPC9iPiIsIG1hcF9zdGF0ZXMkc3RhdGUsICI8YnIvPiIsICI8Yj5QcmV2ZW50YWJsZSBNb3J0YWxpdHk8L2I+IiwgIjxici8+IiwgIjxiPnBlciAxMDAsMDAwOiA8L2I+IiwgbWFwX3N0YXRlcyRkZWF0aHNfYW1lbmFibGVfMjAxNCkpICU+JQogICAgYWRkUG9seWdvbnMoZ3JvdXAgPSAiQWNjZXNzIHRvIFVzdWFsIENhcmUiLCBmaWxsQ29sb3IgPSB+Y29sb3JRdWFudGlsZSgiUmRZbEduIiwgdXN1YWxfY2FyZV8yMDE1KSh1c3VhbF9jYXJlXzIwMTUpLCBzbW9vdGhGYWN0b3IgPSAwLjUsIHN0cm9rZSA9IEZBTFNFLCBmaWxsT3BhY2l0eSA9IDAuNiwgcG9wdXAgPSBwYXN0ZSgiPGI+U3RhdGU6IDwvYj4iLCBtYXBfc3RhdGVzJHN0YXRlLCAiPGJyLz4iLCAiPGI+QWNjZXNzIHRvIFVzdWFsPC9iPiIsICI8YnIvPiIsICI8Yj5Tb3VyY2Ugb2YgQ2FyZTogPC9iPiIsIG1hcF9zdGF0ZXMkdXN1YWxfY2FyZV8yMDE1LCAiJSIpKSAlPiUKICAgIGFkZFBvbHlnb25zKGdyb3VwID0gIkNhbmNlciBTY3JlZW5pbmdzIFJhdGUiLCBmaWxsQ29sb3IgPSB+Y29sb3JRdWFudGlsZSgiUmRZbEduIiwgd2l0aF9jYW5jZXJfc2NyZWVuaW5nKSh3aXRoX2NhbmNlcl9zY3JlZW5pbmcpLCBzbW9vdGhGYWN0b3IgPSAwLjUsIHN0cm9rZSA9IEZBTFNFLCBmaWxsT3BhY2l0eSA9IDAuNiwgcG9wdXAgPSBwYXN0ZSgiPGI+U3RhdGU6IDwvYj4iLCBtYXBfc3RhdGVzJHN0YXRlLCAiPGJyLz4iLCAiPGI+Q2FuY2VyIFNjcmVlbmluZ3M8L2I+IiwgIjxici8+IiwgIjxiPlJhdGU6IDwvYj4iLCBtYXBfc3RhdGVzJHdpdGhfY2FuY2VyX3NjcmVlbmluZywgIiUiKSkgJT4lCiAgICBhZGRQb2x5Z29ucyhncm91cCA9ICJBZHVsdCBWYWNjaW5hdGlvbiBSYXRlIiwgZmlsbENvbG9yID0gfmNvbG9yUXVhbnRpbGUoIlJkWWxHbiIsIHdpdGhfdmFjY2luZXMpKHdpdGhfdmFjY2luZXMpLCBzbW9vdGhGYWN0b3IgPSAwLjUsIHN0cm9rZSA9IEZBTFNFLCBmaWxsT3BhY2l0eSA9IDAuNiwgcG9wdXAgPSBwYXN0ZSgiPGI+U3RhdGU6IDwvYj4iLCBtYXBfc3RhdGVzJHN0YXRlLCAiPGJyLz4iLCAiPGI+VmFjY2luYXRpb248L2I+IiwgIjxici8+IiwgIjxiPlJhdGU6IDwvYj4iLCBtYXBfc3RhdGVzJHdpdGhfdmFjY2luZXMsICIlIikpICU+JQogICAgYWRkTGFiZWxPbmx5TWFya2VycyhkYXRhID0gZmlsdGVyKHN0YXRlLmNlbnRlciwgc3RhdGVfYWJiIT0iQUsiICYgc3RhdGVfYWJiIT0iSEkiKSwgbG5nID0gfngsIGxhdCA9IH55LCBsYWJlbCA9IH5zdGF0ZV9hYmIsIGxhYmVsT3B0aW9ucyA9IGxhYmVsT3B0aW9ucyhub0hpZGUgPSBULCBkaXJlY3Rpb24gPSAndG9wJywgdGV4dE9ubHkgPSBUKSkgJT4lCiAgICBhZGRMYXllcnNDb250cm9sKAogICAgICBiYXNlR3JvdXBzID0gYygiUHJldmVudGFibGUgRGVhdGhzIiwgIkFjY2VzcyB0byBVc3VhbCBDYXJlIiwgIkNhbmNlciBTY3JlZW5pbmdzIFJhdGUiLCAiQWR1bHQgVmFjY2luYXRpb24gUmF0ZSIpLAogICAgICBvcHRpb25zID0gbGF5ZXJzQ29udHJvbE9wdGlvbnMoY29sbGFwc2VkID0gRkFMU0UpKSkgCmBgYAoKCiMgKDMpIEFmZm9yZGFiaWxpdHkgYW5kIENvc3QgT3V0Y29tZXMKCl9fRmlndXJlIDhfXwoKU2ltaWxhcmx5LCB3ZSBtYXAgaG93IHRoZSBzdGF0ZXMgcGVyZm9ybWVkIGluIHZhcmlvdXMgZmluYW5jaWFsIGFuZCBjb3N0IG91dGNvbWVzLCBzdWNoIGFzIHBlcmNlbnRhZ2Ugb2YgcGVvcGxlIHdpdGggaGlnaCBPT1AgY29zdHMgcmVsYXRpdmUgdG8gaG91c2Vob2xkIGluY29tZSwgcHJlbWl1bSBncm93dGggcmF0ZXMsIGFmZm9yZGFiaWxpdHkgb2YgdGhlIG1hcmtldHBsYWNlIHBsYW5zLCBhbmQgaW5jcmVhc2VzIGluIGZlZGVyYWwgc3BlbmRpbmcgcmVsYXRlZCB0byB0aGUgc3RhdGUuIAoKV2Ugbm90aWNlIHRoYXQgc3RhdGVzIHRoYXQgZG8gYmV0dGVyIGluIGNvbnRhaW5pbmcgT09QIGNvc3RzIHRlbmQgdG8gZG8gd29yc2UgaW4gY29udGFpbmluZyBwcmVtaXVtIGFuZCBtYXJrZXRwbGFjZSBwbGFuIHJhdGVzIGFzIHdlbGwgYXMgZmVkZXJhbCBzcGVuZGluZy4gVGhlc2UgaW5jbHVkZSBzb21lIHN0YXRlcyBsaWtlIE5ldyBZb3JrLCBOZXcgSmVyc2V5IGFuZCBPaGlvIGluIHRoZSBOb3J0aGVhc3QgYW5kIE1pZHdlc3QgKEdyZWF0IExha2VzKS4gQSBub3RhYmxlIGV4Y2VwdGlvbiBpcyBNYXNzYWNodXNzZXRzLCB3aGljaCBwZXJmb3JtcyB3ZWxsIGFjcm9zcyB0aGUgZmluYW5jaWFsIG1lYXN1cmVzLCBwb3NzaWJseSBiZWNhdXNlIG9mIHRoZSBoZWFkc3RhcnQgaXQgZ290IHdpdGggIlJvbW5leS1jYXJlIiwgd2hpY2ggYWN0dWFsbHkgc2VydmVkIGFzIGEgbW9kZWwgZm9yIE9iYW1hY2FyZS4KCmBgYHtyLCBldmFsID0gVFJVRSwgZWNobyA9IEZBTFNFLCB3YXJuaW5nID0gRkFMU0UsIHRpZHkgPSBUUlVFfQojIyBQTE9UIDg6IExFQUZMRVQgTUFQIC0gQUZGT1JEQUJJTElUWSAvIENPU1QgT1VUQ09NRVMKCihsZWFmbGV0KG1hcF9zdGF0ZXMpICU+JSAKICAgIHNldFZpZXcobGF0PTM5LjgyODIsIGxuZz0tOTYgLCB6b29tPTQpICU+JQogICAgYWRkUG9seWdvbnMoY29sb3IgPSAiIzMzMzMzMyIsIHdlaWdodCA9IDEsIHNtb290aEZhY3RvciA9IDAuNSwgZmlsbE9wYWNpdHkgPSAwKSAlPiUKICAgIGFkZFBvbHlnb25zKGdyb3VwID0gIkNvbnRhaW5lZCBPT1AgQ29zdHMiLCBmaWxsQ29sb3IgPSB+Y29sb3JRdWFudGlsZSgiUmRZbEduIiwgLWhpZ2hfT09QX3JlbGF0aXZlKSgtaGlnaF9PT1BfcmVsYXRpdmUpLCBzbW9vdGhGYWN0b3IgPSAwLjUsIHN0cm9rZSA9IEZBTFNFLCBmaWxsT3BhY2l0eSA9IDAuNiwgcG9wdXAgPSBwYXN0ZSgiPGI+U3RhdGU6IDwvYj4iLCBtYXBfc3RhdGVzJHN0YXRlLCAiPGJyLz4iLCAiPGI+SGlnaCBPT1AgUmVsYXRpdmU8L2I+IiwgIjxici8+IiwgIjxiPnRvIEluY29tZTogPC9iPiIsIG1hcF9zdGF0ZXMkaGlnaF9PT1BfcmVsYXRpdmUsICIlIikpICU+JQogICAgYWRkUG9seWdvbnMoZ3JvdXAgPSAiUHJlbWl1bSBHcm93dGggUmF0ZSIsIGZpbGxDb2xvciA9IH5jb2xvclF1YW50aWxlKCJSZFlsR24iLCAtcHJlbWl1bV9hbm5fZ3Jvd3RoXzEwXzE1KSgtcHJlbWl1bV9hbm5fZ3Jvd3RoXzEwXzE1KSwgc21vb3RoRmFjdG9yID0gMC41LCBzdHJva2UgPSBGQUxTRSwgZmlsbE9wYWNpdHkgPSAwLjYsIHBvcHVwID0gcGFzdGUoIjxiPlN0YXRlOiA8L2I+IiwgbWFwX3N0YXRlcyRzdGF0ZSwgIjxici8+IiwgIjxiPkFubnVhbCBQcmVtaXVtPC9iPiIsICI8YnIvPiIsICI8Yj5Hcm93dGggUmF0ZTogPC9iPiIsIG1hcF9zdGF0ZXMkcHJlbWl1bV9hbm5fZ3Jvd3RoXzEwXzE1LCAiJSIpKSAlPiUKICAgIGFkZFBvbHlnb25zKGdyb3VwID0gIkFmZm9yZGFibGUgSW5kaXZpZHVhbCBNYXJrZXRwbGFjZSBQbGFuIiwgZmlsbENvbG9yID0gfmNvbG9yUXVhbnRpbGUoIlJkWWxHbiIsIElNX3BsYW5fdW5kZXJfMTAwKShJTV9wbGFuX3VuZGVyXzEwMCksIHNtb290aEZhY3RvciA9IDAuNSwgc3Ryb2tlID0gRkFMU0UsIGZpbGxPcGFjaXR5ID0gMC42LCBwb3B1cCA9IHBhc3RlKCI8Yj5TdGF0ZTogPC9iPiIsIG1hcF9zdGF0ZXMkc3RhdGUsICI8YnIvPiIsICI8Yj5NYXJrZXRwbGFjZSBDb25zdW1lcnM8L2I+IiwgIjxici8+IiwgIjxiPldobyBDYW4gU2VsZWN0IFBsYW48L2I+IiwgIjxici8+IiwiPGI+VW5kZXIgJDEwMDogPC9iPiIsIG1hcF9zdGF0ZXMkSU1fcGxhbl91bmRlcl8xMDAgKiAxMDAsICIlIikpICU+JQogICAgYWRkUG9seWdvbnMoZ3JvdXAgPSAiSW5jcmVhc2UgaW4gRmVkZXJhbCBTcGVuZGluZyIsIGZpbGxDb2xvciA9IH5jb2xvclF1YW50aWxlKCJSZFlsR24iLCAtaW5jcl9mZWRfc3BlbmRpbmdfbWlsKSgtaW5jcl9mZWRfc3BlbmRpbmdfbWlsKSwgc21vb3RoRmFjdG9yID0gMC41LCBzdHJva2UgPSBGQUxTRSwgZmlsbE9wYWNpdHkgPSAwLjYsIHBvcHVwID0gcGFzdGUoIjxiPlN0YXRlOiA8L2I+IiwgbWFwX3N0YXRlcyRzdGF0ZSwgIjxici8+IiwgIjxiPk5ldCBJbmNyZWFzZSBpbiBGZWRlcmFsPC9iPiIsICI8YnIvPiIsICI8Yj5TcGVuZGluZzwvYj46ICQiLCBtYXBfc3RhdGVzJGluY3JfZmVkX3NwZW5kaW5nX21pbCwgIm1pbGxpb24iKSkgJT4lCiAgICBhZGRMYWJlbE9ubHlNYXJrZXJzKGRhdGEgPSBmaWx0ZXIoc3RhdGUuY2VudGVyLCBzdGF0ZV9hYmIhPSJBSyIgJiBzdGF0ZV9hYmIhPSJISSIpLCBsbmcgPSB+eCwgbGF0ID0gfnksIGxhYmVsID0gfnN0YXRlX2FiYiwgbGFiZWxPcHRpb25zID0gbGFiZWxPcHRpb25zKG5vSGlkZSA9IFQsIGRpcmVjdGlvbiA9ICd0b3AnLCB0ZXh0T25seSA9IFQpKSAlPiUKICAgIGFkZExheWVyc0NvbnRyb2woCiAgICAgIGJhc2VHcm91cHMgPSBjKCJDb250YWluZWQgT09QIENvc3RzIiwgIlByZW1pdW0gR3Jvd3RoIFJhdGUiLCAiQWZmb3JkYWJsZSBJbmRpdmlkdWFsIE1hcmtldHBsYWNlIFBsYW4iLCAiSW5jcmVhc2UgaW4gRmVkZXJhbCBTcGVuZGluZyIpLAogICAgICBvcHRpb25zID0gbGF5ZXJzQ29udHJvbE9wdGlvbnMoY29sbGFwc2VkID0gRkFMU0UpKSkgCmBgYAoKCiMgU3VtbWFyeSBvZiBTdGF0ZXMnIFBlcmZvcm1hbmNlCgpgYGB7ciwgZXZhbCA9IFRSVUUsIGVjaG8gPSBGQUxTRSwgd2FybmluZyA9IEZBTFNFLCB0aWR5ID0gVFJVRX0KIyBDcmVhdGUgZGF0YSB0YWJsZSByZXBvcnRpbmcgdmFsdWVzCmRhdGFfdGFibGVfdmFsdWVzIDwtIGtleV9pbmRpY2F0b3JzWyAsIGMoInN0YXRlIiwgImluc3VyZWRfcGN0XzIwMTUiLCAiZGVhdGhzX2FtZW5hYmxlXzIwMTQiLCAidXN1YWxfY2FyZV8yMDE1IiwgImhpZ2hfT09QX3JlbGF0aXZlIiwgInByZW1pdW1fYW5uX2dyb3d0aF8xMF8xNSIpXQoKIyBDcmVhdGUgZGF0YSB0YWJsZSByZXBvcnRpbmcgcmFuawpkYXRhX3RhYmxlX3JhbmsgPC0gZGF0YV90YWJsZV92YWx1ZXMKCiMgQ29udmVydCBlYWNoIGZ1bmN0aW9uIHRvIHJhbmsKICAjIFJhbmsgMSBpcyBhbHdheXMgbW9yZSBmYXZvcmFibGUgKHJlZ2FyZGxlc3Mgb2YgZGVmaW5pdGlvbiBvZiB2YXJpYWJsZSkgICAgCmRhdGFfdGFibGVfcmFuayRyX2luc3VyZWRfcGN0XzIwMTUgPC0gcmFuaygtZGF0YV90YWJsZV92YWx1ZXMkaW5zdXJlZF9wY3RfMjAxNSwgbmEubGFzdCA9ICJrZWVwIiwgdGllcy5tZXRob2QgPSAibWluIikKZGF0YV90YWJsZV9yYW5rJHJfZGVhdGhzX2FtZW5hYmxlXzIwMTQgPC0gcmFuayhkYXRhX3RhYmxlX3ZhbHVlcyRkZWF0aHNfYW1lbmFibGVfMjAxNCwgbmEubGFzdCA9ICJrZWVwIiwgdGllcy5tZXRob2QgPSAibWluIikKZGF0YV90YWJsZV9yYW5rJHJfdXN1YWxfY2FyZV8yMDE1IDwtIHJhbmsoLWRhdGFfdGFibGVfdmFsdWVzJHVzdWFsX2NhcmVfMjAxNSwgbmEubGFzdCA9ICJrZWVwIiwgdGllcy5tZXRob2QgPSAibWluIikKZGF0YV90YWJsZV9yYW5rJHJfaGlnaF9PT1BfcmVsYXRpdmUgPC0gcmFuayhkYXRhX3RhYmxlX3ZhbHVlcyRoaWdoX09PUF9yZWxhdGl2ZSwgbmEubGFzdCA9ICJrZWVwIiwgdGllcy5tZXRob2QgPSAibWluIikKZGF0YV90YWJsZV9yYW5rJHJfcHJlbWl1bV9hbm5fZ3Jvd3RoXzEwXzE1IDwtIHJhbmsoZGF0YV90YWJsZV92YWx1ZXMkcHJlbWl1bV9hbm5fZ3Jvd3RoXzEwXzE1LCBuYS5sYXN0ID0gImtlZXAiLCB0aWVzLm1ldGhvZCA9ICJtaW4iKQogICMgUmVtb3ZlIHZhbHVlIHZhcmlhYmxlcwpkYXRhX3RhYmxlX3JhbmskaW5zdXJlZF9wY3RfMjAxNSA8LSBOVUxMCmRhdGFfdGFibGVfcmFuayRkZWF0aHNfYW1lbmFibGVfMjAxNCA8LSBOVUxMCmRhdGFfdGFibGVfcmFuayR1c3VhbF9jYXJlXzIwMTUgPC0gTlVMTApkYXRhX3RhYmxlX3JhbmskaGlnaF9PT1BfcmVsYXRpdmUgPC0gTlVMTApkYXRhX3RhYmxlX3JhbmskcHJlbWl1bV9hbm5fZ3Jvd3RoXzEwXzE1IDwtIE5VTEwKYGBgCgpUaGUgZm9sbG93aW5nIGRhdGEgdGFibGUgcHJlc2VudHMgdGhlIHJhbmtpbmdzIG9mIHRoZSBzdGF0ZXMgb24gdGhlIGZvbGxvd2luZyBpbnN1cmFuY2UgY292ZXJhZ2UsIGhlYWx0aCBhbmQgYWZmb3JkYWJpbGl0eSBvdXRjb21lcywgcHJvdmlkaW5nIGEgc3VtbWFyeSBvZiB0aGUgc3RhdGVzJyBwZXJmb3JtYW5jZToKCjEpIFBlcmNlbnRhZ2Ugb2YgcG9wdWxhdGlvbiBpbnN1cmVkCgoyKSBEZWF0aHMgcHJldmVudGFibGUgYnkgaGVhbHRoY2FyZSBpbnRlcnZlbnRpb24gKHBlciAxMDAsMDAwIHBlb3BsZSkKCjMpIFByb3BvcnRpb24gb2YgYWR1bHRzIHdpdGggYWNjZXNzIHRvIGEgdXN1YWwgc291cmNlIG9mIGNhcmUKCjQpIFByb3BvcnRpb24gb2YgcGVvcGxlIHdpdGggaGlnaCBvdXQtb2YtcG9ja2V0IGNvc3RzIChyZWxhdGl2ZSB0byBob3VzZWhvbGQgaW5jb21lKQoKNSkgQW5udWFsIHJhdGUgb2YgaGVhbHRoIGluc3VyYW5jZSBwcmVtaXVtIGdyb3d0aCBmcm9tIDIwMTAgdG8gMjAxNQoKQSByYW5rIG9mIDEgYWx3YXlzIGluZGljYXRlcyB0aGUgbW9yZSBmYXZvcmFibGUgb3V0Y29tZSAoaS5lLiBoaWdoZXIgaW5zdXJhbmNlIGFuZCB0cmVhdG1lbnQgYWNjZXNzIHJhdGUsIGxvd2VyIHByZXZlbnRhYmxlIG1vcnRhbGl0eSwgT09QIGNvc3RzIGFuZCBwcmVtaXVtIGdyb3d0aCkKCl9fRmlndXJlIDlfXwoKYGBge3IsIGV2YWwgPSBUUlVFLCBlY2hvID0gRkFMU0UsIHdhcm5pbmcgPSBGQUxTRSwgdGlkeSA9IFRSVUV9CiMjIFBMT1QgOTogREFUQSBUQUJMRSBSQU5LSU5HIFRIRSBTVEFURVMgT04gVkFSSU9VUyBNRUFTVVJFUwpkYXRhdGFibGUoZGF0YV90YWJsZV9yYW5rLCByb3duYW1lcyA9IEZBTFNFLCBjb2xuYW1lcyA9IGMoIlN0YXRlIiwgIlBlcmNlbnRhZ2UgSW5zdXJlZCIsICJGZXdlciBQcmV2ZW50YWJsZSBEZWF0aHMiLCAiVXN1YWwgQ2FyZSBBY2Nlc3MiLCAiT09QIENvbnRhaW5lZCIsICJMb3dlciBBbm51YWwgUHJlbWl1bSBHcm93dGgiKSwgY2FwdGlvbiA9ICJSYW5rIG9mIHRoZSA1MCBTdGF0ZXMgaW4gSW5zdXJhbmNlIENvdmVyYWdlIGFuZCBIZWFsdGggT3V0Y29tZXMiKQpgYGAKCiMgKDQpIFBlcmNlcHRpb25zIG9mIEFDQSAoVGV4dCBBbmFseXNpcykKCmBgYHtyLCB3YXJuaW5nPUZBTFNFLCBpbmNsdWRlPUZBTFNFLCB0aWR5PVRSVUV9CmxpYnJhcnkodG0pCmxpYnJhcnkodG0ucGx1Z2luLmxleGlzbmV4aXMpCmxpYnJhcnkocmVhZHhsKQpsaWJyYXJ5KGd0b29scykgICMgZm9yIHNtYXJ0YmluZApsaWJyYXJ5KGRwbHlyKSAgICMgZm9yIGRhdGFfZnJhbWUKbGlicmFyeShsdWJyaWRhdGUpICAgIyBmb3IgZGF0ZSBmb3JtYXR0aW5nCmxpYnJhcnkoc3RyaW5ncikgIApsaWJyYXJ5KHRvb2xzKSAgIyBUaXRsZSBjYXNlCmxpYnJhcnkocXVhbnRlZGEpCmxpYnJhcnkoZ2dwbG90MikKbGlicmFyeShxdWFudGVkYSkKbGlicmFyeShzdHJpbmdyKQpsaWJyYXJ5KHRtKQpsaWJyYXJ5KHFkYXApCmxpYnJhcnkoU25vd2JhbGxDKQpsaWJyYXJ5KGRwbHlyKQpsaWJyYXJ5KHRpZHl0ZXh0KQpsaWJyYXJ5KHdvcmRjbG91ZCkKCiMgQ29tYmluZSBDU1YgYW5kIEhUTUwgRmlsZXMKZGF0YSA8LSByZWFkX2V4Y2VsKCJMZXhpc05leGlzL05ZVGltZXNfTWV0YWRhdGEueGxzeCIpCmNvbG5hbWVzKGRhdGEpIDwtIHRvbG93ZXIoY29sbmFtZXMoZGF0YSkpCgojIENvcnJlY3QgZGF0YQpkYXRhJGRhdGUgPC0gc3Vic3RyKHBhcnNlX2RhdGVfdGltZShkYXRhJGRhdGUsIGMoIm1keSIpKSwxLDEwKQpkYXRhJGF1dGhvciA8LSB0b1RpdGxlQ2FzZSh0b2xvd2VyKGRhdGEkYnlsaW5lKSkKZGF0YSRieWxpbmUgPC0gTlVMTAoKIyMgR2V0IFRleHQgZmlsZXMKc291cmNlMSA8LSBMZXhpc05leGlzU291cmNlKCJMZXhpc05leGlzL1RoZV9OZXdfWW9yazEuaHRtbCIpCnNvdXJjZTIgPC0gTGV4aXNOZXhpc1NvdXJjZSgiTGV4aXNOZXhpcy9UaGVfTmV3X1lvcmsyLmh0bWwiKQoKY29ycHVzMSA8LSBDb3JwdXMoc291cmNlMSwgcmVhZGVyQ29udHJvbCA9IGxpc3QobGFuZ3VhZ2UgPSBOQSkpCmNvcnB1czIgPC0gQ29ycHVzKHNvdXJjZTIsIHJlYWRlckNvbnRyb2wgPSBsaXN0KGxhbmd1YWdlID0gTkEpKQoKY29ycHVzIDwtIGMoY29ycHVzMSwgY29ycHVzMikKCiMgQ29udmVydCB0byBxdWFudGVkYSBjb3JwdXMKY29ycHVzIDwtIHF1YW50ZWRhOjpjb3JwdXMoY29ycHVzKQoKIyMgQWRkIE1ldGFkYXRhCiMgQ2hlY2s6IG1hdGNoKGRhdGEkaGVhZGxpbmUsIGNvcnB1cyRkb2N1bWVudHMkaGVhZGluZykKY29ycHVzJGRvY3VtZW50cyRkYXRldGltZXN0YW1wIDwtIHN1YnN0cmluZyhjb3JwdXMkZG9jdW1lbnRzJGRhdGV0aW1lc3RhbXAsIDEsNCkKY29ycHVzJGRvY3VtZW50cyRkYXRlIDwtIGNvcnB1cyRkb2N1bWVudHMkZGF0ZXRpbWVzdGFtcApjb3JwdXMkZG9jdW1lbnRzJGRlc2NyaXB0aW9uIDwtIGNvcnB1cyRkb2N1bWVudHMkaWQKCiMgb3B0aW9ucyh3aWR0aCA9IDIwMCkKIyBrd2ljKGNvcnB1cywgIlRydW1wIikKIyAKc2F2ZShjb3JwdXMsIGZpbGU9Im55dGltZXMucmRhIikKYGBgCiNUd2l0dGVyIEFQSSBTZW50aW1lbnQvVGV4dCBBbmFseXNpcwotLS0KR2V0IHNvbWUgdHdlZXRzIGZyb20gVHdpdHRlciB0byBhbmFseXplIGFuZCB2aXN1YWxpemUKU2V0IHVwIFR3aXR0ZXIgQVBJOiBTZWxlY3RpbmcgZGF0YSBpbmNsdWRpbmcgT2JhbWFjYXJlLCBBQ0EsIEFmZm9yZGFibGUgQ2FyZSBBY3QsIGFuZCAjQUNBIChuPTEwMDApCmBgYHtyLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBpbmNsdWRlPUZBTFNFfQpsaWJyYXJ5KGh0dHIpCiNsaWJyYXJ5KG9hdXRoKQpsaWJyYXJ5KFJPQXV0aCkKbGlicmFyeSh0d2l0dGVSKQpsaWJyYXJ5KFJDdXJsKQpsaWJyYXJ5KFJKU09OSU8pCmxpYnJhcnkoc3RyaW5ncikKI3NlY3JldGtleQojbXlhcHAgPC0gb2F1dGhfYXBwKCJ0d2l0dGVyIiwKICAgICAgICAgICAgICAgICAgIyBrZXkgPSAibGlMbjZYSkZlbkdqdHZXRndpNUxuRFMxTSIsCiAgICAgICAgICAgICAgICAgICMgc2VjcmV0ID0gImRzQ0JtOUt5YWV1OUdNS2xNOXh3S2w3ZUttRG42cXNqUDMxTFF0d01Ha0Y2T1FkTGg2IikKI0dldCBPQXV0aCBjcmVkZW50aWFscwojdHdpdHRlcl90b2tlbiA8LSBvYXV0aDEuMF90b2tlbihvYXV0aF9lbmRwb2ludHMoInR3aXR0ZXIiKSwgbXlhcHApCgojIERlY2xhcmUgVHdpdHRlciBBUEkgQ3JlZGVudGlhbHMKYXBpX2tleSA8LSAibGlMbjZYSkZlbkdqdHZXRndpNUxuRFMxTSIgIyBGcm9tIGRldi50d2l0dGVyLmNvbQphcGlfc2VjcmV0IDwtICJkc0NCbTlLeWFldTlHTUtsTTl4d0tsN2VLbURuNnFzalAzMUxRdHdNR2tGNk9RZExoNiIgIyBGcm9tIGRldi50d2l0dGVyLmNvbQp0b2tlbiA8LSAiNzcyMTc2ODExNDU1MzgxNTA1LVBZdU5BRXFoSEZjMDJyODNXUzlZNWRuc1pjaUlZNXYiICMgRnJvbSBkZXYudHdpdHRlci5jb20KdG9rZW5fc2VjcmV0IDwtICJtZ1JQd0tlSFpFdzlZNDg2aDJHTXRDQnhEenRQZlFMWDFNc2Q1dm9nMWhpd3YiICMgRnJvbSBkZXYudHdpdHRlci5jb20KCiMgQ3JlYXRlIFR3aXR0ZXIgQ29ubmVjdGlvbgpsaWJyYXJ5KCJiYXNlNjRlbmMiKQpzZXR1cF90d2l0dGVyX29hdXRoKGFwaV9rZXksIGFwaV9zZWNyZXQsIHRva2VuLCB0b2tlbl9zZWNyZXQpCgojIFJ1biBUd2l0dGVyIFNlYXJjaC4gRm9ybWF0IGlzIHNlYXJjaFR3aXR0ZXIoIlNlYXJjaCBUZXJtcyIsIG49MTAwLCBsYW5nPSJlbiIsIGdlb2NvZGU9ImxhdCxsbmciLCBhbHNvIGFjY2VwdHMgc2luY2UgYW5kIHVudGlsKS4KCnR3ZWV0cyA8LSBzZWFyY2hUd2l0dGVyKCJPYmFtYWNhcmUgT1IgQUNBIE9SICdBZmZvcmRhYmxlIENhcmUgQWN0JyBPUiAjQUNBIiwgbj0xMDAwLCBsYW5nPSJlbiIsIHNpbmNlPSIyMDE0LTA4LTIwIikKCiMgVHJhbnNmb3JtIHR3ZWV0cyBsaXN0IGludG8gYSBkYXRhIGZyYW1lCnR3ZWV0cy5kZiA8LSB0d0xpc3RUb0RGKHR3ZWV0cykKaGVhZCh0d2VldHMuZGYsMykKYGBgCgpXaG8gd2FzIHR3ZWV0aW5nIG1vc3QgaW4gdGhlIHNhbXBsZSB3ZSBjb2xsZWN0ZWQKYGBge3IsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIGVjaG89RkFMU0V9CmNvdW50cz10YWJsZSh0d2VldHMuZGYkc2NyZWVuTmFtZSkKYmFycGxvdChjb3VudHMpCiMgTGV0J3MgZG8gc29tZXRoaW5nIGhhY2t5OgojIExpbWl0IHRoZSBkYXRhIHNldCB0byBzaG93IG9ubHkgZm9sayB3aG8gdHdlZXRlZCB0d2ljZSBvciBtb3JlIGluIHRoZSBzYW1wbGUKY2M9c3Vic2V0KGNvdW50cyxjb3VudHM+MSkKYmFycGxvdChjYyxsYXM9MixjZXgubmFtZXMgPTAuMykKYGBgCgpMZXQncyBoYXZlIGEgZ28gYXQgcGFyc2luZyBzb21lIHR3ZWV0cywgcHVsbGluZyBvdXQgdGhlIG5hbWVzIG9mIGZvbGsgd2hvIGhhdmUgYmVlbiByZXR3ZWV0ZWQgb3IgCndobyBoYXZlIGhhZCBhIHR3ZWV0IHNlbnQgdG8gdGhlbToKYGBge3IsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIGluY2x1ZGU9RkFMU0V9CnR3ZWV0cy5kZiR0ZXh0PXNhcHBseSh0d2VldHMuZGYkdGV4dCxmdW5jdGlvbihyb3cpIGljb252KHJvdyx0bz0nVVRGLTgnKSkKIAojQSBoZWxwZXIgZnVuY3Rpb24gdG8gcmVtb3ZlIEAgc3ltYm9scyBmcm9tIHVzZXIgbmFtZXMuLi4KdHJpbSA8LSBmdW5jdGlvbiAoeCkgc3ViKCdAJywnJyx4KQoKI0EgY291cGxlIG9mIHR3ZWV0IHBhcnNpbmcgZnVuY3Rpb25zIHRoYXQgYWRkIGNvbHVtbnMgdG8gdGhlIGRhdGFmcmFtZQpsaWJyYXJ5KHN0cmluZ3IpCiNQdWxsIG91dCB3aG8gYSBtZXNzYWdlIGlzIHRvCnR3ZWV0cy5kZiR0bz1zYXBwbHkodHdlZXRzLmRmJHRleHQsZnVuY3Rpb24odHdlZXQpIHN0cl9leHRyYWN0KHR3ZWV0LCJeKEBbWzphbG51bTpdX10qKSIpKQp0d2VldHMuZGYkdG89c2FwcGx5KHR3ZWV0cy5kZiR0byxmdW5jdGlvbihuYW1lKSB0cmltKG5hbWUpKQoKI0FuZCBoZXJlJ3MgYSB3YXkgb2YgZ3JhYmJpbmcgd2hvJ3MgYmVlbiBSVCdkCnR3ZWV0cy5kZiRydD1zYXBwbHkodHdlZXRzLmRmJHRleHQsZnVuY3Rpb24odHdlZXQpIHRyaW0oc3RyX21hdGNoKHR3ZWV0LCJeUlQgKEBbWzphbG51bTpdX10qKSIpWzJdKSkKCiNub3cgd2UgY2FuIHBsb3QgYSBjaGFydCBzaG93aW5nIGhvdyBvZnRlbiBhIHBhcnRpY3VsYXIgcGVyc29uIHdhcyBSVCdkIGluIG91ciBzYW1wbGUuCmxpYnJhcnkoZ2dwbG90MikKZ2dwbG90KCkrZ2VvbV9iYXIoYWVzKHg9bmEub21pdCh0d2VldHMuZGYkcnQpKSkKYGBgCgoKX19maWd1cmUgMTBfX18KCkV4dHJhY3RpbmcgdGhlIHNvdXJjZSBhcHBsaWNhdGlvbi4gKFdlJ3JlIGxvb2tpbmcgb25seSBhdCB0aGUgaVBob25lIGFuZCBBbmRyb2lkIHR3ZWV0cy0gYSBtdWNoIHNtYWxsZXIgbnVtYmVyIGFyZSBmcm9tIHRoZSB3ZWIgY2xpZW50IG9yIGlQYWQpLgpPdmVyYWxsLCB0aGlzIGluY2x1ZGVzIDM4OCB0d2VldHMgZnJvbSBpUGhvbmUsIGFuZCAyNTYgdHdlZXRzIGZyb20gQW5kcm9pZC4gT25lIGNvbnNpZGVyYXRpb24gaXMgd2hhdCB0aW1lIG9mIGRheSB0aGUgdHdlZXRzIG9jY3VyLCB3aGljaCB3ZSdkIGV4cGVjdCB0byBiZSBhICJzaWduYXR1cmUiIG9mIHRoZWlyIHVzZXIuIEhlcmUgd2UgY2FuIGNlcnRhaW5seSBzcG90IGEgZGlmZmVyZW5jZToKYGBge3IsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIGVjaG89RkFMU0V9CmxpYnJhcnkodGlkeXIpCmxpYnJhcnkoZHBseXIpCmxpYnJhcnkocHVycnIpCnR3ZWV0cyA8LSB0d2VldHMuZGYgJT4lCiAgc2VsZWN0KGlkLCBzdGF0dXNTb3VyY2UsIHRleHQsIGNyZWF0ZWQpICU+JQogIGV4dHJhY3Qoc3RhdHVzU291cmNlLCAic291cmNlIiwgIlR3aXR0ZXIgZm9yICguKj8pPCIpICU+JQogIGZpbHRlcihzb3VyY2UgJWluJSBjKCJpUGhvbmUiLCAiQW5kcm9pZCIpKQp0YWJsZSh0d2VldHMkc291cmNlKQoKbGlicmFyeShsdWJyaWRhdGUpCmxpYnJhcnkoc2NhbGVzKQp0d2VldHMgJT4lCiAgY291bnQoc291cmNlLCBtaW51dGUgPSBtaW51dGUod2l0aF90eihjcmVhdGVkLCAiRVNUIikpKSAlPiUKICBtdXRhdGUocGVyY2VudCA9IG4gLyBzdW0obikpICU+JQogIGdncGxvdChhZXMobWludXRlLCBwZXJjZW50LCBjb2xvciA9IHNvdXJjZSkpICsKICBnZW9tX2xpbmUoKSArCiAgc2NhbGVfeV9jb250aW51b3VzKGxhYmVscyA9IHBlcmNlbnRfZm9ybWF0KCkpICsKICBsYWJzKHggPSAiTWludXRlIG9mIGRheSAoRVNUKSIsCiAgICAgICB5ID0gIiUgb2YgdHdlZXRzIiwKICAgICAgIGNvbG9yID0gIiIpCmBgYAoKCl9fZmlndXJlIDExX19fCkluIHRoZSByZW1haW5pbmcgYnktd29yZCBhbmFseXNlcyBpbiB0aGlzIHRleHQsIHdlIGZpbHRlciB0aGVzZSBxdW90ZWQgdHdlZXRzIG91dCAoc2luY2UgdGhleSBjb250YWluIHRleHQgZnJvbSBmb2xsb3dlcnMgdGhhdCBtYXkgbm90IGJlIHJlcHJlc2VudGF0aXZlIG9mIG9yaWdpbmFsIHR3ZWV0cy4gU29tZXdoZXJlIGVsc2Ugd2UgY2FuIHNlZSBhIGRpZmZlcmVuY2UgaW52b2x2ZXMgc2hhcmluZyBsaW5rcyBvciBwaWN0dXJlcyBpbiB0d2VldHMuCmBgYHtyLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBlY2hvPUZBTFNFfQp0d2VldF9waWN0dXJlX2NvdW50cyA8LSB0d2VldHMgJT4lCiAgZmlsdGVyKCFzdHJfZGV0ZWN0KHRleHQsICdeIicpKSAlPiUKICBjb3VudChzb3VyY2UsCiAgICAgICAgcGljdHVyZSA9IGlmZWxzZShzdHJfZGV0ZWN0KHRleHQsICJ0LmNvIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAiUGljdHVyZS9saW5rIiwgIk5vIHBpY3R1cmUvbGluayIpKQoKZ2dwbG90KHR3ZWV0X3BpY3R1cmVfY291bnRzLCBhZXMoc291cmNlLCBuLCBmaWxsID0gcGljdHVyZSkpICsKICBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5IiwgcG9zaXRpb24gPSAiZG9kZ2UiKSArCiAgbGFicyh4ID0gIiIsIHkgPSAiTnVtYmVyIG9mIHR3ZWV0cyIsIGZpbGwgPSAiIikKYGBgCgoKX19maWd1cmUgMTJfX18KQ29tcGFyaXNvbiBvZiB3b3JkcwpOb3cgdGhhdCB3ZSdyZSBzdXJlIHRoZXJlJ3MgYSBkaWZmZXJlbmNlLCB3aGF0IGNhbiB3ZSBzYXkgYWJvdXQgdGhlIGRpZmZlcmVuY2UgaW4gdGhlIGNvbnRlbnQ/IFdlJ2xsIHVzZSB0aGUgdGlkeXRleHQgcGFja2FnZS4gV2Ugc3RhcnQgYnkgZGl2aWRpbmcgaW50byBpbmRpdmlkdWFsIHdvcmRzIHVzaW5nIHRoZSB1bm5lc3RfdG9rZW5zIGZ1bmN0aW9uLCBhbmQgcmVtb3Zpbmcgc29tZSBjb21tb24gc3RvcHdvcmRzLgoKYGBge3IsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIGVjaG89RkFMU0V9CmxpYnJhcnkodGlkeXRleHQpCgpyZWcgPC0gIihbXkEtWmEtelxcZCNAJ118Jyg/IVtBLVphLXpcXGQjQF0pKSIKdHdlZXRfd29yZHMgPC0gdHdlZXRzICU+JQogIGZpbHRlcighc3RyX2RldGVjdCh0ZXh0LCAnXiInKSkgJT4lCiAgbXV0YXRlKHRleHQgPSBzdHJfcmVwbGFjZV9hbGwodGV4dCwgImh0dHBzOi8vdC5jby9bQS1aYS16XFxkXSt8JmFtcDsiLCAiIikpICU+JQogIHVubmVzdF90b2tlbnMod29yZCwgdGV4dCwgdG9rZW4gPSAicmVnZXgiLCBwYXR0ZXJuID0gcmVnKSAlPiUKICBmaWx0ZXIoIXdvcmQgJWluJSBzdG9wX3dvcmRzJHdvcmQsCiAgICAgICAgIHN0cl9kZXRlY3Qod29yZCwgIlthLXpdIikpCgpsaWJyYXJ5KHFkYXApCiMgRmluZCB0aGUgMjAgbW9zdCBmcmVxdWVudCB0ZXJtczogdGVybV9jb3VudAp0ZXJtX2NvdW50MSA8LSBmcmVxX3Rlcm1zKHR3ZWV0X3dvcmRzJHdvcmQsMjApCiMgUGxvdCB0ZXJtX2NvdW50CnBsb3QodGVybV9jb3VudDEpCmBgYAoKYGBge3IsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIGVjaG89RkFMU0V9CmFuZHJvaWRfaXBob25lX3JhdGlvcyA8LSB0d2VldF93b3JkcyAlPiUKICBjb3VudCh3b3JkLCBzb3VyY2UpICU+JQogIGZpbHRlcihzdW0obikgPj0gNSkgJT4lCiAgc3ByZWFkKHNvdXJjZSwgbiwgZmlsbCA9IDApICU+JQogIHVuZ3JvdXAoKSAlPiUKICBtdXRhdGVfZWFjaChmdW5zKCguICsgMSkgLyBzdW0oLiArIDEpKSwgLXdvcmQpICU+JQogIG11dGF0ZShsb2dyYXRpbyA9IGxvZzIoQW5kcm9pZCAvIGlQaG9uZSkpICU+JQogIGFycmFuZ2UoZGVzYyhsb2dyYXRpbykpCmxpYnJhcnkoZ2d0aGVtZXMpCmdncGxvdChkYXRhPWFuZHJvaWRfaXBob25lX3JhdGlvcywgYWVzKHggPSB3b3JkLCB5ID0gbG9ncmF0aW8pKSArCiAgZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIpICsgCiAgI2dlb21fdGV4dChhZXMobGFiZWw9cHJlcywgLCB5PTAuMDA1KSwgY29sb3I9IndoaXRlIikgKwogIHhsYWIoTlVMTCkgKyAgY29vcmRfZmxpcCgpICsgdGhlbWVfdHVmdGUoKQoKZ2dwbG90KGRhdGE9YW5kcm9pZF9pcGhvbmVfcmF0aW9zLCBhZXMoeCA9IHdvcmQsIHkgPSBBbmRyb2lkKSkgKwogIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiKSArIAogICNnZW9tX3RleHQobGFiZWw9IEFuZHJvaWQsIGNvbG9yPSJyZWQiKSArCiAgeGxhYihOVUxMKSArICBjb29yZF9mbGlwKCkgKyB0aGVtZV90dWZ0ZSgpCgpnZ3Bsb3QoZGF0YT1hbmRyb2lkX2lwaG9uZV9yYXRpb3MsIGFlcyh4ID0gd29yZCwgeT1pUGhvbmUpKSArCiAgZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIpICsgCiAgI2dlb21fdGV4dChsYWJlbD0gQW5kcm9pZCwgY29sb3I9InJlZCIpICsKICB4bGFiKE5VTEwpICsgIGNvb3JkX2ZsaXAoKSArIHRoZW1lX3R1ZnRlKCkKYGBgCgpTZW50aW1lbnQgYW5hbHlzaXM6ClNpbmNlIHdlJ3ZlIG9ic2VydmVkIGEgZGlmZmVyZW5jZSBpbiBzZW50aW1lbnQgYmV0d2VlbiB0aGUgQW5kcm9pZCBhbmQgaVBob25lIHR3ZWV0cywgbGV0J3MgdHJ5IHF1YW50aWZ5aW5nIGl0LiBXZSdsbCB3b3JrIHdpdGggdGhlIE5SQyBXb3JkLUVtb3Rpb24gQXNzb2NpYXRpb24gbGV4aWNvbiwgYXZhaWxhYmxlIGZyb20gdGhlIHRpZHl0ZXh0IHBhY2thZ2UsIHdoaWNoIGFzc29jaWF0ZXMgd29yZHMgd2l0aCAxMCBzZW50aW1lbnRzOiBwb3NpdGl2ZSwgbmVnYXRpdmUsIGFuZ2VyLCBhbnRpY2lwYXRpb24sIGRpc2d1c3QsIGZlYXIsIGpveSwgc2FkbmVzcywgc3VycHJpc2UsIGFuZCB0cnVzdC4KYGBge3IsIGV2YWwgPSBUUlVFLCBlY2hvID0gRkFMU0UsIHdhcm5pbmcgPSBGQUxTRSwgdGlkeSA9IFRSVUV9Cm5yYyA8LSBzZW50aW1lbnRzICU+JQogIGZpbHRlcihsZXhpY29uID09ICJucmMiKSAlPiUKICBkcGx5cjo6c2VsZWN0KHdvcmQsIHNlbnRpbWVudCkKYGBgCgoKVG8gbWVhc3VyZSB0aGUgc2VudGltZW50IG9mIHRoZSBBbmRyb2lkIGFuZCBpUGhvbmUgdHdlZXRzLCB3ZSBjYW4gY291bnQgdGhlIG51bWJlciBvZiB3b3JkcyBpbiBlYWNoIGNhdGVnb3J5LiAoRm9yIGV4YW1wbGUsIHdlIHNlZSB0aGF0IDQxIG9mIHRoZSAyMzMxIHdvcmRzIGluIHRoZSBBbmRyb2lkIHR3ZWV0cyB3ZXJlIGFzc29jaWF0ZWQgd2l0aCAiYW5nZXIiKS4gV2UgdGhlbiB3YW50IHRvIG1lYXN1cmUgaG93IG11Y2ggbW9yZSBsaWtlbHkgdGhlIEFuZHJvaWQgYWNjb3VudCBpcyB0byB1c2UgYW4gZW1vdGlvbmFsbHktY2hhcmdlZCB0ZXJtIHJlbGF0aXZlIHRvIHRoZSBpUGhvbmUgYWNjb3VudC4gU2luY2UgdGhpcyBpcyBjb3VudCBkYXRhLCB3ZSBjYW4gdXNlIGEgUG9pc3NvbiB0ZXN0IHRvIG1lYXN1cmUgdGhlIGRpZmZlcmVuY2U6CmBgYHtyLCBldmFsID0gVFJVRSwgZWNobyA9IEZBTFNFLCB3YXJuaW5nID0gRkFMU0UsIHRpZHkgPSBUUlVFfQpzb3VyY2VzIDwtIHR3ZWV0X3dvcmRzICU+JQogIGdyb3VwX2J5KHNvdXJjZSkgJT4lCiAgbXV0YXRlKHRvdGFsX3dvcmRzID0gbigpKSAlPiUKICB1bmdyb3VwKCkgJT4lCiAgZGlzdGluY3QoaWQsIHNvdXJjZSwgdG90YWxfd29yZHMpCgpieV9zb3VyY2Vfc2VudGltZW50IDwtIHR3ZWV0X3dvcmRzICU+JQogIGlubmVyX2pvaW4obnJjLCBieSA9ICJ3b3JkIikgJT4lCiAgY291bnQoc2VudGltZW50LCBpZCkgJT4lCiAgdW5ncm91cCgpICU+JQogIGNvbXBsZXRlKHNlbnRpbWVudCwgaWQsIGZpbGwgPSBsaXN0KG4gPSAwKSkgJT4lCiAgaW5uZXJfam9pbihzb3VyY2VzKSAlPiUKICBncm91cF9ieShzb3VyY2UsIHNlbnRpbWVudCwgdG90YWxfd29yZHMpICU+JQogIHN1bW1hcml6ZSh3b3JkcyA9IHN1bShuKSkgJT4lCiAgdW5ncm91cCgpCgpoZWFkKGJ5X3NvdXJjZV9zZW50aW1lbnQpCmBgYAoKX19maWd1cmUgMTNfX18KYGBge3IsIGV2YWwgPSBUUlVFLCBlY2hvID0gRkFMU0UsIHdhcm5pbmcgPSBGQUxTRSwgdGlkeSA9IFRSVUV9CmxpYnJhcnkoYnJvb20pCgpzZW50aW1lbnRfZGlmZmVyZW5jZXMgPC0gYnlfc291cmNlX3NlbnRpbWVudCAlPiUKICBncm91cF9ieShzZW50aW1lbnQpICU+JQogIGRvKHRpZHkocG9pc3Nvbi50ZXN0KC4kd29yZHMsIC4kdG90YWxfd29yZHMpKSkKCnNlbnRpbWVudF9kaWZmZXJlbmNlcwoKI2xpYnJhcnkocmVzaGFwZTIpCiNkZi5sb25nIDwtIG1lbHQoYnlfc291cmNlX3NlbnRpbWVudCkKI2RmLmxvbmcgPC0gZGYubG9uZ1syMTo0MCxdCmdncGxvdChieV9zb3VyY2Vfc2VudGltZW50LCBhZXMoeCA9IHNlbnRpbWVudCwgeSA9IHdvcmRzKSkgKwogIGdlb21fYmFyKGFlcyhmaWxsPXNvdXJjZSksIHN0YXQgPSAiaWRlbnRpdHkiLHBvc2l0aW9uPSJkb2RnZSIpICsgCiAgc2NhbGVfZmlsbF9icmV3ZXIocGFsZXR0ZT0iU3BlY3RyYWwiKSArCiAgeGxhYihOVUxMKSArICBjb29yZF9mbGlwKCkgKyB0aGVtZV90dWZ0ZSgpCmBgYAoKRGF0YSBQcmVwYXJhdGlvbiB1c2luZyBUd2l0dGVyOiAKVGhlIFR3aXR0ZXIgc2VhcmNoIEFQSSBkb2VzIG5vdCByZXR1cm4gYW4gZXhoYXVzdGl2ZSBsaXN0IG9mIHR3ZWV0cyB0aGF0IG1hdGNoIHlvdXIgc2VhcmNoIGNyaXRlcmlhLCBhcyBUd2l0dGVyIG9ubHkgbWFrZXMgYXZhaWxhYmxlIGEgc2FtcGxlIG9mIHJlY2VudCB0d2VldHMuIEZvciBhIG1vcmUgY29tcHJlaGVuc2l2ZSBzZWFyY2gsIHdlIHdpbGwgbmVlZCB0byB1c2UgdGhlIFR3aXR0ZXIgc3RyZWFtaW5nIEFQSSwgY3JlYXRpbmcgYSBkYXRhYmFzZSBvZiByZXN1bHRzIGFuZCByZWd1bGFybHkgdXBkYXRpbmcgdGhlbSwgb3IgdXNlIGFuIG9ubGluZSBzZXJ2aWNlIHRoYXQgY2FuIGRvIHRoaXMuCk5vdyB0aGF0IHdlIGhhdmUgdHdlZXQgdGV4dHMsIHdlIG5lZWQgdG8gY2xlYW4gdGhlbSB1cCBiZWZvcmUgZG9pbmcgYW55IGFuYWx5c2lzLiBUaGlzIGludm9sdmVzIHJlbW92aW5nIGNvbnRlbnQsIHN1Y2ggYXMgcHVuY3R1YXRpb24sIHRoYXQgaGFzIG5vIGVtb3Rpb25hbCBjb250ZW50LCBhbmQgcmVtb3ZpbmcgYW55IGNvbnRlbnQgdGhhdCBjYXVzZXMgZXJyb3JzLgoKClRleHQgQ2xlYW5pbmcKYGBge3IsIGV2YWwgPSBUUlVFLCBlY2hvID0gRkFMU0UsIHdhcm5pbmcgPSBGQUxTRSwgdGlkeSA9IFRSVUV9CmxpYnJhcnkodG0pCiMgYnVpbGQgYSBjb3JwdXMsIGFuZCBzcGVjaWZ5IHRoZSBzb3VyY2UgdG8gYmUgY2hhcmFjdGVyIHZlY3RvcnMKbXlDb3JwdXMgPC0gQ29ycHVzKFZlY3RvclNvdXJjZSh0d2VldHMuZGYkdGV4dCkpCiMgY29udmVydCB0byBsb3dlciBjYXNlCiMgdG0gdjAuNgpteUNvcnB1cyA8LSB0bV9tYXAobXlDb3JwdXMsIGNvbnRlbnRfdHJhbnNmb3JtZXIodG9sb3dlcikpCiMgdG0gdjAuNS0xMAojIG15Q29ycHVzIDwtIHRtX21hcChteUNvcnB1cywgdG9sb3dlcikKIyByZW1vdmUgVVJMcwpyZW1vdmVVUkwgPC0gZnVuY3Rpb24oeCkgZ3N1YigiaHR0cFteWzpzcGFjZTpdXSoiLCAiIiwgeCkKIyB0bSB2MC42Cm15Q29ycHVzIDwtIHRtX21hcChteUNvcnB1cywgY29udGVudF90cmFuc2Zvcm1lcihyZW1vdmVVUkwpKQojIHRtIHYwLjUtMTAKIyBteUNvcnB1cyA8LSB0bV9tYXAobXlDb3JwdXMsIHJlbW92ZVVSTCkKIyByZW1vdmUgYW55dGhpbmcgb3RoZXIgdGhhbiBFbmdsaXNoIGxldHRlcnMgb3Igc3BhY2UKcmVtb3ZlTnVtUHVuY3QgPC0gZnVuY3Rpb24oeCkgZ3N1YigiW15bOmFscGhhOl1bOnNwYWNlOl1dKiIsICIiLCB4KQpteUNvcnB1cyA8LSB0bV9tYXAobXlDb3JwdXMsIGNvbnRlbnRfdHJhbnNmb3JtZXIocmVtb3ZlTnVtUHVuY3QpKQojIHJlbW92ZSBwdW5jdHVhdGlvbgojIG15Q29ycHVzIDwtIHRtX21hcChteUNvcnB1cywgcmVtb3ZlUHVuY3R1YXRpb24pCiMgcmVtb3ZlIG51bWJlcnMKIyBteUNvcnB1cyA8LSB0bV9tYXAobXlDb3JwdXMsIHJlbW92ZU51bWJlcnMpCiMgYWRkIHR3byBleHRyYSBzdG9wIHdvcmRzOiAiYXZhaWxhYmxlIiBhbmQgInZpYSIKbXlTdG9wd29yZHMgPC0gYyhzdG9wd29yZHMoJ2VuZ2xpc2gnKSwgImF2YWlsYWJsZSIsICJ2aWEiKQojIHJlbW92ZSAiciIgYW5kICJiaWciIGZyb20gc3RvcHdvcmRzCm15U3RvcHdvcmRzIDwtIHNldGRpZmYobXlTdG9wd29yZHMsIGMoInIiLCAiYmlnIikpCiMgcmVtb3ZlIHN0b3B3b3JkcyBmcm9tIGNvcnB1cwpteUNvcnB1cyA8LSB0bV9tYXAobXlDb3JwdXMsIHJlbW92ZVdvcmRzLCBteVN0b3B3b3JkcykKIyByZW1vdmUgZXh0cmEgd2hpdGVzcGFjZQpteUNvcnB1cyA8LSB0bV9tYXAobXlDb3JwdXMsIHN0cmlwV2hpdGVzcGFjZSkKIyBrZWVwIGEgY29weSBvZiBjb3JwdXMgdG8gdXNlIGxhdGVyIGFzIGEgZGljdGlvbmFyeSBmb3Igc3RlbSBjb21wbGV0aW9uCm15Q29ycHVzQ29weSA8LSBteUNvcnB1cwojIHN0ZW0gd29yZHMKbXlDb3JwdXMgPC0gdG1fbWFwKG15Q29ycHVzLCBzdGVtRG9jdW1lbnQpCiMgaW5zcGVjdCB0aGUgZmlyc3QgNSBkb2N1bWVudHMgKHR3ZWV0cykKIyBpbnNwZWN0KG15Q29ycHVzWzE6NV0pCiMgVGhlIGNvZGUgYmVsb3cgaXMgdXNlZCBmb3IgdG8gbWFrZSB0ZXh0IGZpdCBmb3IgcGFwZXIgd2lkdGgKZm9yIChpIGluIGMoMToyLCAzMjApKSB7CmNhdChwYXN0ZTAoIlsiLCBpLCAiXSAiKSkKd3JpdGVMaW5lcyhzdHJ3cmFwKGFzLmNoYXJhY3RlcihteUNvcnB1c1tbaV1dKSwgNjApKQp9CiMjIFsxXSBleGFtcGwgY2FsbCBqYXZhIGNvZGUgcgojIyBbMl0gc2ltdWwgbWFwcmVkdWMgciBiaWcgZGF0YSBhbmFseXNpIHVzZSBmbGlnaHQgZGF0YSByYmxvZ2dlcgojIyBbMzIwXSByIHJlZmVyIGNhcmQgZGF0YSBtaW5lIG5vdyBjcmFuIGxpc3QgbWFuaSB1c2UgciBmdW5jdGlvbgojIyBwYWNrYWcgZGF0YSBtaW5lIGFwcGxpYwojIHRtIHYwLjUtMTAKIyBteUNvcnB1cyA8LSB0bV9tYXAobXlDb3JwdXMsIHN0ZW1Db21wbGV0aW9uKQojIHRtIHYwLjYKc3RlbUNvbXBsZXRpb24yIDwtIGZ1bmN0aW9uKHgsIGRpY3Rpb25hcnkpIHsKeCA8LSB1bmxpc3Qoc3Ryc3BsaXQoYXMuY2hhcmFjdGVyKHgpLCAiICIpKQojIFVuZXhwZWN0ZWRseSwgc3RlbUNvbXBsZXRpb24gY29tcGxldGVzIGFuIGVtcHR5IHN0cmluZyB0bwojIGEgd29yZCBpbiBkaWN0aW9uYXJ5LiBSZW1vdmUgZW1wdHkgc3RyaW5nIHRvIGF2b2lkIGFib3ZlIGlzc3VlLgp4IDwtIHhbeCAhPSAiIl0KeCA8LSBzdGVtQ29tcGxldGlvbih4LCBkaWN0aW9uYXJ5PWRpY3Rpb25hcnkpCnggPC0gcGFzdGUoeCwgc2VwPSIiLCBjb2xsYXBzZT0iICIpClBsYWluVGV4dERvY3VtZW50KHN0cmlwV2hpdGVzcGFjZSh4KSkKfQojbXlDb3JwdXMgPC0gbGFwcGx5KG15Q29ycHVzLCBzdGVtQ29tcGxldGlvbjIsIGRpY3Rpb25hcnk9bXlDb3JwdXNDb3B5KQpteUNvcnB1cyA8LSBDb3JwdXMoVmVjdG9yU291cmNlKG15Q29ycHVzKSkKCiMgY291bnQgZnJlcXVlbmN5IG9mICJtaW5pbmciCm1pbmluZ0Nhc2VzIDwtIGxhcHBseShteUNvcnB1c0NvcHksCmZ1bmN0aW9uKHgpIHsgZ3JlcChhcy5jaGFyYWN0ZXIoeCksIHBhdHRlcm4gPSAiXFw8bWluaW5nIil9ICkKc3VtKHVubGlzdChtaW5pbmdDYXNlcykpCiMjIFsxXSA4MgojIGNvdW50IGZyZXF1ZW5jeSBvZiAibWluZXIiCm1pbmVyQ2FzZXMgPC0gbGFwcGx5KG15Q29ycHVzQ29weSwKZnVuY3Rpb24oeCkge2dyZXAoYXMuY2hhcmFjdGVyKHgpLCBwYXR0ZXJuID0gIlxcPG1pbmVyIil9ICkKc3VtKHVubGlzdChtaW5lckNhc2VzKSkKIyMgWzFdIDUKIyByZXBsYWNlICJtaW5lciIgd2l0aCAibWluaW5nIgpteUNvcnB1cyA8LSB0bV9tYXAobXlDb3JwdXMsIGNvbnRlbnRfdHJhbnNmb3JtZXIoZ3N1YiksCnBhdHRlcm4gPSAibWluZXIiLCByZXBsYWNlbWVudCA9ICJtaW5pbmciKQoKdGRtIDwtIFRlcm1Eb2N1bWVudE1hdHJpeChteUNvcnB1cywKY29udHJvbCA9IGxpc3Qod29yZExlbmd0aHMgPSBjKDEsIEluZikpKQp0ZG0KIyMgPDxUZXJtRG9jdW1lbnRNYXRyaXggKHRlcm1zOiA4MjIsIGRvY3VtZW50czogMzIwKT4+CiMjIE5vbi0vc3BhcnNlIGVudHJpZXM6IDI0NjAvMjYwNTgwCiMjIFNwYXJzaXR5IDogOTklCiMjIE1heGltYWwgdGVybSBsZW5ndGg6IDI3CiMjIFdlaWdodGluZyA6IHRlcm0gZnJlcXVlbmN5ICh0ZikKYGBgCgpfX2ZpZ3VyZSAxNF9fXwpGcmVxdWVudCBXb3JkcyBhbmQgQXNzb2NpYXRpb25zCmBgYHtyLCBldmFsID0gVFJVRSwgZWNobyA9IEZBTFNFLCB3YXJuaW5nID0gRkFMU0UsIHRpZHkgPSBUUlVFfQp0ZXJtLmZyZXEgPC0gcm93U3Vtcyhhcy5tYXRyaXgodGRtKSkKdGVybS5mcmVxIDwtIHN1YnNldCh0ZXJtLmZyZXEsIHRlcm0uZnJlcSA+PSAxNSkKZGYgPC0gZGF0YS5mcmFtZSh0ZXJtID0gbmFtZXModGVybS5mcmVxKSwgZnJlcSA9IHRlcm0uZnJlcSkKbGlicmFyeShnZ3Bsb3QyKQpnZ3Bsb3QoZGYsIGFlcyh4ID0gdGVybSwgeSA9IGZyZXEpKSArIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiKSArCnhsYWIoIlRlcm1zIikgKyB5bGFiKCJDb3VudCIpICsgY29vcmRfZmxpcCgpCgpgYGAKCl9fZmlndXJlIDE1X19fCldvcmQgQ2xvdWQKYGBge3IsIGV2YWwgPSBUUlVFLCBlY2hvID0gRkFMU0UsIHdhcm5pbmcgPSBGQUxTRSwgdGlkeSA9IFRSVUV9CiNsaWJyYXJ5KGdyYXBoKQojc291cmNlKCJodHRwOi8vYmlvY29uZHVjdG9yLm9yZy9iaW9jTGl0ZS5SIikKI2Jpb2NMaXRlKCJSZ3JhcGh2aXoiKQojbGlicmFyeSgiUmdyYXBodml6IikKI3Bsb3QodGRtLCB0ZXJtID0gdGVybS5mcmVxLCBjb3JUaHJlc2hvbGQgPSAwLjIsIHdlaWdodGluZyA9IFQpCgptIDwtIGFzLm1hdHJpeCh0ZG0pCiMgY2FsY3VsYXRlIHRoZSBmcmVxdWVuY3kgb2Ygd29yZHMgYW5kIHNvcnQgaXQgYnkgZnJlcXVlbmN5CndvcmQuZnJlcSA8LSBzb3J0KHJvd1N1bXMobSksIGRlY3JlYXNpbmcgPSBUKQojIGNvbG9ycwpsaWJyYXJ5KFJDb2xvckJyZXdlcikKcGFsIDwtIGJyZXdlci5wYWwoOSwgIkJ1R24iKQpwYWwgPC0gcGFsWy0oMTo0KV0KCiMgcGxvdCB3b3JkIGNsb3VkCmxpYnJhcnkod29yZGNsb3VkKQp3b3JkY2xvdWQod29yZHMgPSBuYW1lcyh3b3JkLmZyZXEpLCBmcmVxID0gd29yZC5mcmVxLCBtaW4uZnJlcSA9IDMsCnJhbmRvbS5vcmRlciA9IEYsIGNvbG9ycyA9IHBhbCkKCmBgYAoKX19GaWd1cmUgMTZfXwoKVG9waWMgTW9kZWxsaW5nCmBgYHtyLCBldmFsID0gVFJVRSwgZWNobyA9IEZBTFNFLCB3YXJuaW5nID0gRkFMU0UsIHRpZHkgPSBUUlVFfQppbnN0YWxsLnBhY2thZ2VzKCJ0b3BpY21vZGVscyIpCmR0bSA8LSBhcy5Eb2N1bWVudFRlcm1NYXRyaXgodGRtKQpsaWJyYXJ5KHRvcGljbW9kZWxzKQpsZGEgPC0gTERBKGR0bSwgayA9IDgpICMgZmluZCA4IHRvcGljcwoodGVybSA8LSB0ZXJtcyhsZGEsIDYpKSAjIGZpcnN0IDYgdGVybXMgb2YgZXZlcnkgdG9waWMKCmBgYAoKCiMgVGV4dCBhbmFseXNpczogTWVkaWEgYW5kIHRoZSBBZmZvcmRhYmxlIGNhcmUgYWN0CldlIGFyZSBhbHNvIGludGVyZXN0ZWQgaW4gaG93IHBlb3BsZSB0aGluayBhYm91dCBBZmZvcmRhYmxlIGNhcmUgYWN0KEFDQSkuIFdlIHdhbnQgdG8gaGF2ZSBhIGxvb2sgb2YgdGhlIHR3ZWV0cyBhbmQgbmV3c3BhcGVyIHJlbGF0ZWQgdG8gQUNBLiBUbyByZWFsaXplIHRoaXMsIHdlIHVzZSBBUEkgdG8gZG93bmxvYWQgYXJ0aWNsZXMgcmVhbHRlZCB0byBBQ0Egb24gTmV3IHlvcmsgdGltZXMgZnJvbSAyMDExLTIwMTcgYW5kIHRyYW5zZm9ybSB0aGVtIGludG8gY29ycHVzIHRvIGRvIHRoZSB0ZXh0IGFuYWx5c2lzLgoKX19SZXNlYXJjaCBRdWVzdGlvbnM6X18KMSkgVGhlIG92ZXJsbCB0cmVuZCBvZiBwdWJsdWMgYXR0ZW50aW9uLCB3aGljaCBjYW4gYmUgc2hvd24gYXMgdGhlIG51bWJlciBvZiBhcnRpY2xlcyByZWxhdGVkIHRvIEFDQSBpbiBkaWZmZXJlbnQgeWVhcnMuCjIpIFdoYXQgcGVvcGxlIGRpc2N1c3MgYWJvdXQgd2hlbiB0aGV5IGRpc2N1c3MgQUNBLCB3aGljaCBjYW4gYmUgc2hvd24gYXMgdGhlIHdvcmQgZnJlcXVlbmNpZXMuCgpXZSBjb3VsZCBzZWUgdGhhdCBwZW9wbGUgZGlzY3Vzc2VkIEFDQSBhIGxvdCB3aGVuIG9iYW1hIGZpcnN0IHNpZ25lZCBpdCwgYW5kIHRoZSBlbGVjdGlvbiBpbiAyMDE3IG1hZGUgaXQgYSBob3QgdG9waWMgYWdhaW4uIEFuZCBub3Qgc3VwcmlzaW5nbHksIHBlb3BlbCBhbHdheXMgdGFsayBhYm91dCBUcnVtcCB3aGVuIHRoZXkgdGFsayBhYm91dCBBQ0EKCl9fRmlndXJlIDE3X18KCldlIGNvdWxkIHNlZSB0aGF0IHBlb3BsZSBkaXNjdXNzZWQgQUNBIGEgbG90IHdoZW4gT2JhbWEgZmlyc3Qgc2lnbmVkIGl0LCBhbmQgdGhlIGVsZWN0aW9uIGluIDIwMTcgbWFkZSBpdCBhIGhvdCB0b3BpYyBhZ2Fpbi4gQW5kIG5vdCBzdXByaXNpbmdseSwgcGVvcGxlIGFsd2F5cyB0YWxrIGFib3V0IFRydW1wIHdoZW4gdGhleSB0YWxrIGFib3V0IEFDQS4KCmBgYHtyLCBldmFsID0gVFJVRSwgZWNobyA9IEZBTFNFLCB3YXJuaW5nID0gRkFMU0UsIHRpZHkgPSBUUlVFfQpkYXQgPC0gZGF0YS5mcmFtZShkYXRlID1jb3JwdXMkZG9jdW1lbnRzJGRhdGV0aW1lc3RhbXAsIGxldmVscz1jKDE6MTAwMCkpCmdncGxvdChkYXRhPWRhdCwgYWVzKHg9ZGF0ZSkpK2dlb21fYmFyKHN0YXQ9ImNvdW50IikrZ2d0aXRsZSgiTnVtYmVyIG9mIEFydGljbGVzIE1lbnRpb25pbmcgQUNBIGJ5IFllYXIiKSt0aGVtZV90dWZ0ZSgpK3lsYWIoIk51bWJlciBvZiBhcnRpY2xlcyIpICsgeGxhYigieWVhciIpICsgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChmYWNlPSJib2xkIiwgaGp1c3QgPSAwLjUsIHNpemUgPSAxMikpCgpgYGAKCmBgYHtyLCBldmFsID0gVFJVRSwgZWNobyA9IEZBTFNFLCB3YXJuaW5nID0gRkFMU0UsIHRpZHkgPSBUUlVFfQpsb2FkKCJueXRpbWVzLnJkYSIpCmRmbXRvdGFsIDwtIGRmbShjb3JwdXMsIHJlbW92ZSA9IHN0b3B3b3JkcygiZW5nbGlzaCIpLCBzdGVtID0gVFJVRSwgcmVtb3ZlUHVuY3QgPSBUUlVFLCByZW1vdmVOdW1iZXJzID0gVFJVRSwgdG9sb3dlciA9IFRSVUUsIHZlcmJvc2UgPSBUUlVFKQpkZm10b3RhbFssIDE6NV0KaGVhZChzdG9wd29yZHMoImVuZ2xpc2giKSwgMjApCmZyZXE8LXRvcGZlYXR1cmVzKGRmbXRvdGFsLCAyMCkKd2YgPC0gZGF0YS5mcmFtZSh3b3JkPW5hbWVzKGZyZXEpLCBmcmVxPWZyZXEpICAgCmBgYAoKX19GaWd1cmUgMThfXwoKYGBge3IsIGV2YWwgPSBUUlVFLCBlY2hvID0gRkFMU0UsIHdhcm5pbmcgPSBGQUxTRSwgdGlkeSA9IFRSVUV9CnAgPC0gZ2dwbG90KHN1YnNldCh3ZiwgZnJlcT41MCksIGFlcyh3b3JkLCBmcmVxKSkgICAgCnAgPC0gcCArIGdlb21fYmFyKHN0YXQ9ImlkZW50aXR5IikKcCA8LSBwICsgZ2VvbV90ZXh0KGFlcyhsYWJlbD1mcmVxKSwgdmp1c3Q9LTAuMikrIHNjYWxlX3hfZGlzY3JldGUobGltaXRzPSB3ZiR3b3JkKSAgIApwIDwtIHAgKyB0aGVtZShheGlzLnRleHQueD1lbGVtZW50X3RleHQoYW5nbGU9NDUsIGhqdXN0PTEpLCBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGZhY2U9ImJvbGQiLCBoanVzdCA9IDAuNSwgc2l6ZSA9IDEyKSkrZ2d0aXRsZSgiV29yZCBGcmVxdWVuY3kgZnJvbSBBcnRpY2xlcyBvbiBBQ0EsIDIwMTEtMjAxNyIpK3RoZW1lX3R1ZnRlKCkreWxhYigiRnJlcXVlbmN5IG9mIFN0ZW0iKSArIHhsYWIoIlRvcCAzMCBVc2VkIFN0ZW0iKQpwCmBgYAoKYGBge3IsIGV2YWwgPSBUUlVFLCBlY2hvID0gRkFMU0UsIHdhcm5pbmcgPSBGQUxTRSwgdGlkeSA9IFRSVUV9CmxvYWQoJ255dGltZXMucmRhJykKTllUX3NvdXJjZSA8LSBWZWN0b3JTb3VyY2UoY29ycHVzJGRvY3VtZW50c1ssMV0pCk5ZVCA8LSBWQ29ycHVzKE5ZVF9zb3VyY2UpCmRvY3VtZW50cyA8LSBjb3JwdXMkZG9jdW1lbnRzCnJlbW92ZU51bVB1bmN0IDwtIGZ1bmN0aW9uKHgpe2dzdWIoIlteWzphbHBoYTpdWzpzcGFjZTpdXSoiLCAiIiwgeCl9CmNsZWFuX2NvcnB1cyA8LSBmdW5jdGlvbihjb3JwdXMpewpjb3JwdXMgPC0gdG1fbWFwKGNvcnB1cywgcmVtb3ZlUHVuY3R1YXRpb24pCmNvcnB1cyA8LSB0bV9tYXAoY29ycHVzLCBjb250ZW50X3RyYW5zZm9ybWVyKHRvbG93ZXIpKQpjb3JwdXMgPC0gdG1fbWFwKGNvcnB1cywgY29udGVudF90cmFuc2Zvcm1lcihyZXBsYWNlX3N5bWJvbCkpCmNvcnB1cyA8LSB0bV9tYXAoY29ycHVzLCByZW1vdmVXb3JkcywgYyhzdG9wd29yZHMoImVuZ2xpc2giKSwgIndpbGwiLCAiY2FuIikpCiMgV2UgY291bGQgYWRkIG1vcmUgc3RvcCB3b3JkcyBhcyBhYm92ZQpjb3JwdXMgPC0gdG1fbWFwKGNvcnB1cywgc3RyaXBXaGl0ZXNwYWNlKQpjb3JwdXMgPC0gdG1fbWFwKGNvcnB1cywgcmVtb3ZlTnVtYmVycykKY29ycHVzIDwtIHRtX21hcChjb3JwdXMsIGNvbnRlbnRfdHJhbnNmb3JtZXIocmVtb3ZlTnVtUHVuY3QpKQpyZXR1cm4oY29ycHVzKQp9Ck5ZVF9jbGVhbiA8LSBjbGVhbl9jb3JwdXMoTllUKQpOWVRfc3RlbSA8LSB0bV9tYXAoTllUX2NsZWFuLCBzdGVtRG9jdW1lbnQpCm1ldGEoTllUX3N0ZW0sIHR5cGUgPSAibG9jYWwiLCB0YWcgPSAiYXV0aG9yIikgPC0gZG9jdW1lbnRzJGF1dGhvcgpOWVRfZHRtIDwtIERvY3VtZW50VGVybU1hdHJpeChOWVRfc3RlbSkKTllUX3RkbSA8LSBUZXJtRG9jdW1lbnRNYXRyaXgoTllUX3N0ZW0pCgpOWVRfdGRtMiA8LSB0aWR5KE5ZVF90ZG0pCk5ZVF9kdG0yIDwtIHRpZHkoTllUX2R0bSkKTllUX3RpZHkgPC0gdGlkeShOWVRfc3RlbSkKTllUX3RkbTIgPC0gbWVyZ2UoTllUX3RkbTIsIE5ZVF90aWR5LCBieS54ID0gImRvY3VtZW50IiwgYnkueSA9ICJpZCIsIGFsbC54ID0KVFJVRSkKTllUX2R0bTIgPC0gbWVyZ2UoTllUX2R0bTIsIE5ZVF90aWR5LCBieS54ID0gImRvY3VtZW50IiwgYnkueSA9ICJpZCIsIGFsbC54ID0KVFJVRSkKCmBgYAoKCl9fRmlndXJlIDE5X18KCiMjIyMjIFdvcmRjbG91ZCBieSBZZWFyCgpgYGB7ciwgZXZhbCA9IFRSVUUsIGVjaG8gPSBGQUxTRSwgd2FybmluZyA9IEZBTFNFLCB0aWR5ID0gVFJVRX0KYXR4dCA8LSBkb2N1bWVudHMkdGV4dHNbZG9jdW1lbnRzJGRhdGV0aW1lc3RhbXAgPT0gIjIwMTEiXQpidHh0IDwtIGRvY3VtZW50cyR0ZXh0c1tkb2N1bWVudHMkZGF0ZXRpbWVzdGFtcCA9PSAiMjAxMiJdCmN0eHQgPC0gZG9jdW1lbnRzJHRleHRzW2RvY3VtZW50cyRkYXRldGltZXN0YW1wID09ICIyMDEzIl0KZHR4dCA8LSBkb2N1bWVudHMkdGV4dHNbZG9jdW1lbnRzJGRhdGV0aW1lc3RhbXAgPT0gIjIwMTQiXQpldHh0IDwtIGRvY3VtZW50cyR0ZXh0c1tkb2N1bWVudHMkZGF0ZXRpbWVzdGFtcCA9PSAiMjAxNSJdCmZ0eHQgPC0gZG9jdW1lbnRzJHRleHRzW2RvY3VtZW50cyRkYXRldGltZXN0YW1wID09ICIyMDE2Il0KZ3R4dCA8LSBkb2N1bWVudHMkdGV4dHNbZG9jdW1lbnRzJGRhdGV0aW1lc3RhbXAgPT0gIjIwMTciXQoKY2xlYW4udGV4dCA8LSBmdW5jdGlvbih4KQp7CiMgdG9sb3dlcgp4ID0gdG9sb3dlcih4KQojIHJlbW92ZSBydAp4ID0gZ3N1YigicnQiLCAiIiwgeCkKIyByZW1vdmUgYXQKeCA9IGdzdWIoIkBcXHcrIiwgIiIsIHgpCiMgcmVtb3ZlIHB1bmN0dWF0aW9uCnggPSBnc3ViKCJbWzpwdW5jdDpdXSIsICIiLCB4KQojIHJlbW92ZSBudW1iZXJzCnggPSBnc3ViKCJbWzpkaWdpdDpdXSIsICIiLCB4KQojIHJlbW92ZSBsaW5rcyBodHRwCnggPSBnc3ViKCJodHRwXFx3KyIsICIiLCB4KQojIHJlbW92ZSB0YWJzCnggPSBnc3ViKCJbIHxcdF17Mix9IiwgIiIsIHgpCiMgcmVtb3ZlIGJsYW5rIHNwYWNlcyBhdCB0aGUgYmVnaW5uaW5nCnggPSBnc3ViKCJeICIsICIiLCB4KQojIHJlbW92ZSBibGFuayBzcGFjZXMgYXQgdGhlIGVuZAp4ID0gZ3N1YigiICQiLCAiIiwgeCkKcmV0dXJuKHgpCn0KCmFjbGVhbiA8LSBjbGVhbi50ZXh0KGF0eHQpCmJjbGVhbiA8LSBjbGVhbi50ZXh0KGJ0eHQpCmNjbGVhbiA8LSBjbGVhbi50ZXh0KGN0eHQpCmRjbGVhbiA8LSBjbGVhbi50ZXh0KGR0eHQpCmVjbGVhbiA8LSBjbGVhbi50ZXh0KGV0eHQpCmZjbGVhbiA8LSBjbGVhbi50ZXh0KGZ0eHQpCmdjbGVhbiA8LSBjbGVhbi50ZXh0KGd0eHQpCgphIDwtIHBhc3RlKGFjbGVhbiwgY29sbGFwc2U9IiAiKQpiIDwtIHBhc3RlKGJjbGVhbiwgY29sbGFwc2U9IiAiKQpjIDwtIHBhc3RlKGNjbGVhbiwgY29sbGFwc2U9IiAiKQpkIDwtIHBhc3RlKGRjbGVhbiwgY29sbGFwc2U9IiAiKQplIDwtIHBhc3RlKGVjbGVhbiwgY29sbGFwc2U9IiAiKQpmIDwtIHBhc3RlKGZjbGVhbiwgY29sbGFwc2U9IiAiKQpnIDwtIHBhc3RlKGdjbGVhbiwgY29sbGFwc2U9IiAiKQoKIyBwdXQgZXZlcnl0aGluZyBpbiBhIHNpbmdsZSB2ZWN0b3IKYWxsIDwtIGMoYSxiLGMsZCxlLGYsZykKYWxsIDwtIHJlbW92ZVdvcmRzKGFsbCwgYygid2lsbCIsICJjYW4iLCAidGhlIiwgInRoYXQiLCJhcmUiLCJtcnMiLCJub3QiLCJzYWlkIiwiY291IikpCiMgY3JlYXRlIGNvcnB1cwpjb3JwdXMyIDwtIENvcnB1cyhWZWN0b3JTb3VyY2UoYWxsKSkKIyBjcmVhdGUgdGVybS1kb2N1bWVudCBtYXRyaXgKY2xvdWR0ZG0gPC0gVGVybURvY3VtZW50TWF0cml4KGNvcnB1czIpCiMgY29udmVydCBhcyBtYXRyaXgKY2xvdWR0ZG0gPC0gYXMubWF0cml4KGNsb3VkdGRtKQojIGFkZCBjb2x1bW4gbmFtZXMKY29sbmFtZXMoY2xvdWR0ZG0pIDwtIGMoIjIwMTEiLCIyMDEyIiwiMjAxMyIsIjIwMTQiLCIyMDE1IiwiMjAxNiIsIjIwMTciKQpjb21wYXJpc29uLmNsb3VkKGNsb3VkdGRtLCByYW5kb20ub3JkZXI9RkFMU0UsY29sb3JzID0gYnJld2VyLnBhbCg4LCAiRGFyazIiKSx0aXRsZS5zaXplPTEuNSwgbWF4LndvcmRzID0gMjAwKQpgYGAK